基于返回类型的转换和过载扣除

时间:2018-10-16 10:10:27

标签: c++ templates overloading return-type auto

我在C ++核心指南中看到,最好从函数返回输出值。

我试图了解这对于通用代码是否方便。

例如,为了将字符串转换为特定值,我通常会执行以下操作:

template<class T>
T convertTo(const std::string& value)
  {
  // Do conversion
  return convertedValue;
  }

// Usage
convertTo<float>("test");

不指定我要做的类型:

template<class T>
void convertTo(const std::string& value, T& outputValue)
  {
  // Do conversion
  // outputValue = convertedType
  }

// Usage
float myVar{};
convertTo("test", myVar);

我也知道您可以执行以下操作:

auto convertTo(const std::string& value, anotherInputPerhaps) ->decltype(myexpression)
  {
  // get the type to return basing on anotherInputPerhaps
  return /*convertedValue*/
  }

这里的问题是如何获得正确的转换后的值,可能无需传递任何输入或使用默认值。这可能吗?

谢谢

[EDIT]寻找不会带来开销的东西

2 个答案:

答案 0 :(得分:3)

您可以使用转换运算符返回类,例如:

struct Converter
{
    template <typename T>
    operator T() const /*&&*/ { /*Do conversion*/ return {}; }

    const std::string& s;
};

Converter convert(const std::string& value)
{
  return { value };
}

使用方式:

float f = convert("test");
int i = convert("test");
std::vector<int> v = convert("test");

Demo

答案 1 :(得分:2)

使用默认值,您还可以执行以下操作:

template<class T>
T convertTo(const std::string& value, T default_value)
{
   // DO Conversion
   if( conversion success)
     return convertedValue;
   else 
     return default_value;
}

并这样称呼它:

float myVar= DEFAULT_VALUE;
myVar = convertTo("test", myVar);