Необязательный параметр Template - PullRequest
28 голосов
/ 17 октября 2011

Возможно ли иметь необязательный параметр шаблона в C ++, например

template < class T, class U, class V>
class Test {
};

Здесь я хочу, чтобы пользователь использовал этот класс с V или без V

Возможно ли следующее

Test<int,int,int> WithAllParameter
Test<int,int> WithOneMissing

Если да, как это сделать.

Ответы [ 2 ]

28 голосов
/ 17 октября 2011

Конечно, вы можете иметь параметры шаблона по умолчанию:

template <typename T, typename U, typename V = U>

template <typename T, typename U = int, typename V = std::vector<U> >

Стандартная библиотека делает это постоянно - большинство контейнеров принимают от двух до пяти параметров! Например, unordered_map на самом деле:

template<
    class Key,                        // needed, key type
    class T,                          // needed, mapped type
    class Hash = std::hash<Key>,      // hash functor, defaults to std::hash<Key>
    class KeyEqual = std::equal_to<Key>, // comparator, defaults to Key::operator==()
    class Allocator = std::allocator<std::pair<const Key, T>> // allocator, defaults to std::allocator
> class unordered_map;

Обычно вы просто используете его как std::unordered_map<std::string, double>, не задумываясь об этом.

26 голосов
/ 17 октября 2011

Вы можете иметь шаблон по умолчанию аргументов шаблона, которых достаточно для ваших целей:

template<class T, class U = T, class V = U>
class Test
{ };

Теперь выполняются следующие работы:

Test<int> a;           // Test<int, int, int>
Test<double, float> b; // Test<double, float, float>
...