是否可以实现支持以下实例化的模板类Type
?
Type<int> typeArg_;
Type<nullptr> nonTypeArg_;
我希望有一个解决方案(尤其是没有宏)。也许std::enable_if
神奇或有帮助...
答案 0 :(得分:1)
不,你不能那样做。
模板参数的性质是固定的。它是类型或非类型(值)。不能是一个用例的类型,不能是另一个用例的类型。
如果您可以详细说明那是什么,可能会有一些方法可以实现目标。
答案 1 :(得分:-1)
到目前为止,在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;
正如Jarod42所指出的(感谢),该标准(从C ++ 11开始)提供了一种标准结构,该结构具有ValueWrapper
功能:std::integral_constant
。
对于ValueWrapper
,以下C ++ 17简化形式可以代替std::integral_constant
使用它,但不起作用。
由于可以使用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;