我想给模板参数一个默认的类型和值。该参数并未真正使用,仅与区分类实例有关。我想使用机制为课程提供一个关键。
我正在尝试类似的操作,但是编译器不喜欢
template<typename K = int>
template<typename T, K Key = K(0)>
class DataAction : public Action
{
// ...
};
类型T
为我保留数据。类型Key
具有一定的价值,可以轻松使用enum class
类型,如果未分配,则应默认为int 0
。
以下将起作用。
template<typename T, typename K = int, K Key = K(0)>
class DataAction : public Action
但这要求我先定义类型,然后定义值,这不好。
auto instance = DatatAction<int, SomeEnumType, SomeEnumType::SomeKey>();
其目的是用户可能希望使用具有相同数据类型T
的DataAction的多个类实例。为了能够在dynamic_cast中区分它们(无论如何还是必需的),使用了附加的密钥类型。
答案 0 :(得分:1)
在C ++ 17中,您可以使用 auto 模板参数:
template <typename T, auto = 0>
class DataAction : public Action
{
}
这里0是一个整数,但是如果您确实想混淆具有相同值的不同类型,也可以分配(char)0或其他类型。 :)
就我个人而言,我更喜欢一种类型,并且没有默认值。这避免了旁观者大多数意外的键重用和混乱。