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

Можно ли реализовать шаблонный класс Type, который поддерживает следующие экземпляры?

Type<int> typeArg_;
Type<nullptr> nonTypeArg_;

Я надеюсь, что есть решение (особенно без макроса).Может быть std::enable_if -магическое или что-то поможет ...

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Насколько я понимаю, в C ++ это невозможно.

Лучшее, что приходит мне в голову, - это заключать значения в типы;что-то как

template <typename T, T Value>
struct ValueWrapper
 { };

и специализируется Type для ValueWrapper

что-то как

template <typename T>
struct Type
 { /* something with T */ };

template <typename T, T Value>
struct Type<ValueWrapper<T, Value>>
 { /* something with value */ };

Использование становится

Type<int>  typeArg;
Type<ValueWrapper<std::nullptr_t, nullptr>> nonTypeArg;

or also

Type<ValueWrapper<decltype(nullptr), nullptr>> nonTypeArg;

Asотмеченный Jarod42 (спасибо), стандарт (начиная с C ++ 11) предоставляет стандартную структуру, которая делает функцию ValueWrapper: std::integral_constant.

Вы можете использовать ее вместоValueWrapper, но не работает, для std::integral_constant, следующее усиление C ++ 17.

Потому что, если вы можете использовать C ++ 17, все станет проще: вы можете использовать auto для значениятипы, поэтому ValueWrapper становятся

template <auto Value>
struct ValueWrapper
 { };

так Type нетипичные специализации становятся

template <auto Value>
struct Type<ValueWrapper<Value>>
 { /* something with value */ };

и использование

Type<int>  typeArg;
Type<ValueWrapper<nullptr>> nonTypeArg;
0 голосов
/ 14 декабря 2018

Нет, вы не можете этого сделать.

Природа параметра шаблона фиксирована.Это либо тип, либо нетип (значение).Это не может быть тип для одного варианта использования и не тип для другого варианта использования.

Могут быть способы достижения вашей цели, если вы можете уточнить, что это такое.

...