如何使用is_arithmetic采取通用参考
How to use is_arithmetic taking an universal 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_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;
}
这似乎很正常,因为 is_arithmetic::value = false 对于数字类型 (http://en.cppreference.com/w/cpp/types/is_arithmetic) 的引用。但是,在通用引用的情况下,我如何测试我的变量是否是数字?
你想要
std::is_arithmetic<std::remove_reference_t<T>>
由于转发引用使T
引用可能是符合 CV 条件的类型或此类类型本身,并且is_arithmetic
已经处理了 CV 限定符。
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 避免在基于反向范围的for循环实现中悬挂参考
- 通用参考 l 值不复制对象
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- C++丢失了参考
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 矢量的通用参考
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- C++17 和静态临时生存期的参考扩展
- C++ 参考:这两个语句有什么区别?
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?