在C++中,变量模板有没有办法忽略非算术类型或对象并返回剩余参数的总和?

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)

我可以理解所描述的错误,但是,我无法找到解决方案。

son*_*yao 6

您可以在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)

居住