强制函数只接受一组特定的数据类型
Forcing a function to only accept a certain set of data types
有没有办法强制函数只接受整数向量(int、unsigned int、uint32_t等)?我试图写一个简单的函数,用相同的返回类型返回所有值的总和(因为我不能确定这个值是否会大于(2^32-1)。然而,由于std::vector<T>
对于整个类型没有cout
运算符,我不能执行sum(vector<vector<T> >)
,因为它将返回一个向量(忽略向量+向量不起作用的事实)。我不希望重载每个类型来定制一些东西,因为我不需要它。我只希望当T是某种形式的int(如果可能的话,还有float)时,函数可以工作
我尝试使用try/except
,但代码块捕获了类型的运算符,所以如果我使用sum(vector <vector <T> >)
,我就无法编译
template <typename T>
T sum(std::vector <T> in){
try{
T total = 0;
for(int x = 0; x < in.size(); x++)
total += in[x];
return total;
}
catch (int e){
std::cout << "Error " << e << " has occured." << std::endl;
exit(e);
}
}
template <typename T>
typename std::enable_if<
std::is_integral<typename std::remove_reference<T>::type>::value,
T>::type
sum(const std::vector<T>& in) { return std::accumulate(in.begin(), in.end(), 0); }
SFINAE前往救援。
#include <type_traits>
//#include <tr1/type_traits> // for C++03, use std::tr1::
template<bool, class T = void>
struct enable_if{};
template<class T>
struct enable_if<true,T>{
typedef T type;
};
template<class T>
typename enable_if<
std::is_arithmetic<T>::value,
T
>::type sum(std::vector <T> in){
T total = 0;
for(int x = 0; x < in.size(); x++)
total += in[x];
return total;
}
相关文章:
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 使用标准库或Boost库从一组数据中计算直方图
- 将 constexpr 数组扩展为一组非类型模板参数
- 如何根据一组规则/条件检查一组数据以进行分类
- c++我需要将文件中的数据读取到多维数组中,然后用一种数据类型对数组进行排序.怎样
- 查找一组数据中的最小数字
- JNI:如何将一组数据从c++转换为Java
- 返回一组数据类型之一的最佳模式
- 无法从一种数据类型转换为相同的数据类型?
- 将一组数据拆分为不同的类别
- 在QT C++中更新数据库中的一组数据
- 从一组数据中求出奇数的最小最大值和偶数的和
- 更改一组数据结构中元素的值
- 我想实现一种数据类型,它可以在c++中接受整数值加上一个无穷大符号
- 读取多个文件,并为每个文件保留一组数据
- 按类型在一组数据成员中进行选择,其中每种类型仅使用一次
- 数组数据类型声明
- 使用boost c++为一组数据生成指数分布
- 在编译时将std::数组强制转换为另一种数据类型