强制函数只接受一组特定的数据类型

Forcing a function to only accept a certain set of data types

本文关键字:一组 数据类型 函数      更新时间:2023-10-16

有没有办法强制函数只接受整数向量(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;
}