Как я могу специализировать шаблон с шаблоном? - PullRequest
0 голосов
/ 21 ноября 2018

Рассмотрим шаблонный класс

template<class T>
class Foo
{
};

, для которого я могу написать простую специализацию

template<>
class Foo<int>
{
};

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

template<>
class Foo<int, bool> // Clearly not the correct notation.
{

}

Использование будет включать Foo <1, true> и Foo <1, false>.

Какая правильная запись дляимя класса, где я пометил «Ясно, не правильная запись».?

Я кодирую к стандарту C ++ 11.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

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

Пример:

template<class T>
class Foo;

template<int, bool> class tag;

template<int>
class Foo<tag<int, true>> { ... };

template<int>
class Foo<tag<int, false>> { ... };

И чем вы можете его использовать

Foo<tag<1, true>> foo;
0 голосов
/ 21 ноября 2018

Похоже на значение по умолчанию для аргумента шаблона.

template<class T, bool flag = false>
class Foo
{
};

template<>
class Foo<int>
{
    //"false" specialization (default)
};

template<>
class Foo<int, true>
{
    //"true" specialization
};
0 голосов
/ 21 ноября 2018

Вам нужно изменить основной шаблон на

template<class T, bool B>
class Foo
{
};

, а затем вы можете специализировать его как

template<>
class Foo<int, true>
{
};

template<>
class Foo<int, false>
{
};
...

, и тогда вы будете использовать его как

Foo<int, true> FooT;
Foo<int, false> FooF;

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

Foo<1, true>

Тогда основной шаблон должен быть

template<int I, bool B>
class Foo
{
};

, а затем вы можете специализировать его как

template<>
class Foo<1, true>
{
};

template<>
class Foo<1, false>
{
};
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...