she*_*rey 5 c++ templates c++11
我想实现一个如问题标题所述的功能,例如:
cout << SumValue("abc", string("abcd"), 1.3, 1, 10, 2, 100) << endl;
Run Code Online (Sandbox Code Playgroud)
我想要 C++ 代码片段输出、和忽略和114.3的总和。
我尝试了变量模板函数并使用库作为代码如下:1.3, 1, 10, 2 and 100"abc"string("abcd")<type_traits>
template <typename T>
long double SumValue(T first)
{
if (is_arithmetic<T>::value)
return first;
else
return 0;
}
template <typename T, typename... Args>
long double SumValue(T first, Args... args)
{
if (is_arithmetic<T>::value)
return first + SumValue(args...);
else
return SumValue(args...);
}
Run Code Online (Sandbox Code Playgroud)
但编译器报错:
error: invalid operands of types 'const char*' and 'long double' to binary 'operator+'
return first + SumValue(args...);
~~~~~~^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我可以理解所描述的错误,但是,我无法找到解决方案。
您可以在SFINAESumValue的帮助下超载。
template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value, long double>::type
SumValue(T first)
{
return first;
}
template <typename T>
typename std::enable_if<!std::is_arithmetic<T>::value, long double>::type
SumValue(T first)
{
return 0;
}
template <typename T, typename... Args>
long double SumValue(T first, Args... args)
{
return SumValue(first) + SumValue(args...);
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句:从 C++17 开始,您可以使用Constexpr If。
template <typename T>
long double SumValue(T first)
{
if constexpr (std::is_arithmetic<T>::value)
return first;
else
return 0;
}
template <typename T, typename... Args>
long double SumValue(T first, Args... args)
{
return SumValue(first) + SumValue(args...);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |