Аргументы по умолчанию в шаблоне - PullRequest
3 голосов
/ 12 мая 2010

Возможно ли иметь что-то вроде этого:

template<class T = unsigned = 64>
class X
{
};

Что в основном говорит о том, что если ничего не указано, то тип unsigned должен быть и его значение должно быть 64.

Ответы [ 2 ]

4 голосов
/ 12 мая 2010

В буквальном смысле это не имеет смысла. Объясните, что вы пытаетесь сделать в первую очередь.

Шаблоны в C ++ имеют три вида параметров: 1) параметры типа, 2) параметры значения (не тип), 3) параметры шаблона.

Когда вы объявляете параметр как class T, это параметр type (первый вид). Это «значение» на самом деле тип . unsigned, например. То есть «значение» T равно unsigned. unsigned будет заменен вместо T в этом экземпляре шаблона class X. Параметр T не может иметь никакого числового значения, например 64.

Тем не менее, вы, кажется, пытаетесь создать какой-то гибрид между параметрами 1 и 2 типа. Во-первых, это невозможно. Во-вторых, нет никакого способа выяснить, какое семантическое значение это могло бы иметь. Пожалуйста, уточните свои намерения.

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

template <unsigned N = 64>
class X {
};

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

3 голосов
/ 12 мая 2010

Не совсем. Вы могли бы сделать что-то близкое, хотя:


template < typename T = unsigned, T value = 64>
struct X{};

Редактировать: до меня дошло, что я читаю ваш другой ответ, что есть что-то еще, что вы можете сделать, если вы действительно хотите:


template < unsigned N = 64 >
struct unsigned_
{
  typedef unsigned type;
  enum { value = N };
};

// alternative versions...int, long, etc...

template < typename T = unsigned_<64> >
struct X {};

Это создает кучу дополнительной работы для пользователя. Вы можете решить некоторые из этих проблем, используя boost :: enable_if и is_fundamental, чтобы пользователь мог предоставить базовый тип, не разбирая его, поскольку вы ищете T :: type и T :: value.

Так что, хотя нет никакого способа сделать именно то, что вы ищете ... в зависимости от того, насколько уродливым вы хотите получить, вы можете быть чертовски близко с точки зрения пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...