C++ 如何使用作为通用参考的算术?

C++ 如何使用作为通用参考的算术?,c++,typetraits,forwarding-reference,C++,Typetraits,Forwarding Reference,通过使用可变模板,我创建了对元素求和的函数 它工作得很好,但我想添加一个type_trait测试来检查传递的所有参数是否都是数字类型 如果我给r值,它会工作,但如果我给左值,它会阻塞 sum.h #ifndef SUM_H_INCLUDED #define SUM_H_INCLUDED #include<type_traits> template <typename T> double sums_(T && arg) { static

通过使用可变模板,我创建了对元素求和的函数

它工作得很好,但我想添加一个type_trait测试来检查传递的所有参数是否都是数字类型

如果我给r值,它会工作,但如果我给左值,它会阻塞

    sum.h

#ifndef SUM_H_INCLUDED
#define SUM_H_INCLUDED

#include<type_traits>

template <typename T>
double sums_(T && arg)
{
    static_assert(std::is_arithmetic<T>::value,"Only numbers !");
    return arg;
}

template <typename T, typename ... Args>
double sums_(T && val, Args &&... args)
{
    return sums_(std::forward<T>(val)) + sums_(std::forward<Args>(args)...);
}

template <typename ... Args>
double sums(Args &&... args)
{
    return sums_(std::forward<Args>(args)...);
}


#endif // SUM_H_INCLUDED

    main.cpp

#include <iostream>
#include "sum.h"


int main()
{

    //works
    std::cout << sums(42.30,28) << std::endl;

    int x = 100;
    //error
    std::cout << sums(42.30,28,x) << std::endl;

    return 0;
}
sum.h
#如果不包括总额
#定义包含的和
#包括
模板
双和(T&&arg)
{
静态断言(std::是算术::值,“仅限数字!”);
返回arg;
}
模板
双和(T&&val,Args&&…Args)
{
返回sums(std::forward(val))+sums(std::forward)。但是,在通用引用的情况下,我如何测试我的变量是否为数字?

您想要什么

std::is_arithmetic<std::remove_reference_t<T>>
std::is\u算术
由于转发引用使
T
成为对可能的cv限定类型的引用或此类类型本身的引用,并且
是\u算术
已经处理cv限定符。

您想要什么

std::is_arithmetic<std::remove_reference_t<T>>
std::is\u算术

由于转发引用使
T
成为对可能的cv限定类型的引用或此类类型本身的引用,并且
is\u算术
已经能够处理cv限定符。

非常有效。谢谢!非常有效。谢谢!