强制函数仅接受某组数据类型

时间:2011-06-09 04:44:22

标签: c++ types sum

有没有办法强制函数只接受整数向量(int,unsigned int,uint32_t等)而只有那些?我试图写一个简单的函数,返回具有相同返回类型的所有值的总和(因为我不能确定该值是否将大于(2 ^ 32 - 1)。但是,因为{{1}没有std::vector<T>运算符用于整个类型,我不能做cout,因为它将返回一个向量(忽略向量+向量不起作用的事实)。我不希望重载每个类型因为我不需要它而烦恼。我只是希望函数在T是某种形式的int时工作(如果可能的话浮动)

我已尝试使用sum(vector<vector<T> >),但代码块会捕获类型的运算符,所以如果我执行try/except

,我就无法编译
sum(vector <vector <T> >)

2 个答案:

答案 0 :(得分:3)

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); }

答案 1 :(得分:2)

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;
}