Насколько я понимаю, в 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;