Принуждение функции принимать только определенный набор типов данных - PullRequest
2 голосов
/ 09 июня 2011

есть ли способ заставить функции принимать только векторы целых чисел (int, unsigned int, uint32_t и т. Д.) И только эти?Я пытаюсь написать простую функцию, которая возвращает сумму всех значений с одинаковым типом возврата (так как я не могу быть уверен, будет ли значение больше (2 ^ 32 - 1). Однако, поскольку std::vector<T> неу меня есть оператор cout для всего типа, я не могу сделать sum(vector<vector<T> >), так как он вернет вектор (игнорируя тот факт, что вектор + вектор не работает). Я не хочу перегружать каждый тип, чтобы что-то отслеживать, потому что я немне просто нужно, чтобы функция работала, когда T - это некоторая форма типа int (и, если возможно, с плавающей точкой)

Я пытался использовать 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);
    }
}

Ответы [ 2 ]

3 голосов
/ 09 июня 2011
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); }
2 голосов
/ 09 июня 2011

СФИНАЕ на помощь.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...