基于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");
我在 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");