基于return类型的转换和重载扣除

Conversion and overload deduction based on return type

我在 C++ 核心指南中看到它比 return 函数输出值更可取。

我想了解这是否方便通用代码。

例如,为了将字符串转换为特定值,我通常会这样做:

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*/
  }

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

谢谢

[编辑] 寻找不会引入开销的东西

使用默认值你也可以这样做:

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);

您可能 return class 使用转换运算符,例如:

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