使用可变参数模板我创建了对元素求和的函数。
它运行良好,但我想添加一个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;
}
看起来很正常,因为对于数字类型(http://en.cppreference.com/w/cpp/types/is_arithmetic)的引用,is_arithmetic :: value = false。但是,在通用引用的情况下,如何测试我的变量是数字?
答案 0 :(得分:3)
你想要
std::is_arithmetic<std::remove_reference_t<T>>
因为转发引用使T
引用了可能的cv限定类型或类型本身,is_arithmetic
已经处理了cv限定符。