2016-03-08 2 views
0

У меня есть функция f:STL контейнер параметр шаблона, содержащий определенный объект

template <typename T> 
void f(T<int> ints) 
{ /* */ } 

Эта функция должна принимать std::vector<int> или std::initializer_list<int> или любой другой контейнер STL, но только, если она содержит int.

я могу жить с ним принимать другие class эс с int в качестве параметра шаблона, но я не хочу, чтобы принять std::vector<char> или std::vector<double> или std::list<double> или что-то вроде этого.

Как я могу это понять?

ответ

5

Вы могли использовать параметр шаблона шаблон:

template <template <typename...> typename T> 
void f(const T<int>& ints) 
{ /* */ } 

Но я бы рекомендовал использовать элемент value_type типа контейнеров вместо. Это позволит избежать сопоставления других шаблонов с параметром int.

//using std::enable_if_t 
template <typename T> 
std::enable_if_t<std::is_same<typename T::value_type, int>::value> 
f(const T& ints) 
{ /* */ } 

//or static_assert 
template <typename T> 
void f(const T& ints) { 
    static_assert(std::is_same<typename T::value_type, int>::value, 
        "T must be a container of ints"); 
    //... 
} 
+0

Есть ли значение желаемых один подход по сравнению с другими ('станд :: enable_if_t' против' static_assert')? – hgiesel

+1

@hgiesel Подход 'std :: enable_if' позволяет вам иметь другие перегрузки, которые могут быть выбраны, если эта версия недействительна, а также документирует ваши требования к типу в объявлении. Метод 'static_assert' дает лучшее сообщение об ошибке и не мутирует ваше объявление. – TartanLlama

1

Педантично, это шаблон функции, из которого создается функция.

Одним из решений является обнаружение value_type которых стандартные контейнеры обеспечивают:

template<class T> 
typename std::enable_if<std::is_same<int, typename T::value_type>::value>::type 
void f(T const& ints); 

Это не будет работать со встроенными массивами, хотя, так как они не имеют встроенные value_type. Для встроенных массивов можно добавить перегрузки:

template<size_t N> 
void f(int const(&ints)[N]); 
Смежные вопросы