如何通过类型和非类型模板参数重载模板类?

时间:2018-12-13 22:45:09

标签: c++ class templates overloading metaprogramming

是否可以实现支持以下实例化的模板类Type

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

我希望有一个解决方案(尤其是没有宏)。也许std::enable_if神奇或有帮助...

2 个答案:

答案 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;