具有默认类型和值的模板参数

Template argument with default type and value

我想为模板参数提供默认类型和值。该参数并没有真正使用,它只与区分 class 个实例有关。我想使用机械师给 classes 一把钥匙。

我正在尝试类似的操作,但编译器不喜欢它

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 的多个 class DataAction 实例。为了能够在 dynamic_cast 中区分它们,这是无论如何都需要的,使用了额外的键类型。

在 C++17 中,您可以使用 auto 模板参数:

template <typename T, auto = 0>
class DataAction : public Action
{
}

此处 0 是一个 int,但如果您真的想混淆具有相同值的不同类型,您也可以分配 (char)0 或其他类型。 :)

就我个人而言,我更喜欢单一类型并且没有默认值。这避免了旁观者大多数意外的密钥重用和混淆。