C++,我可以禁止特定的策略组合吗?
C++, can I disallow a specific combination of Policies?
给定一个采用两个策略模板参数的类:
template<typename PolicyA, typename PolicyB>
class widget;
以及以下可用的策略类别 A1、A2、A3、B1、B2、B3。如何传达 1 和 2 彼此兼容,但 A3 仅与 B3 兼容?也就是说,只允许以下实例化:
widget<A1, B1> w11; // All valid.
widget<A1, B2> w12;
widget<A2, B1> w21;
widget<A2, B2> w22;
widget<A3, B3> w33;
// No other combination allowed.
我在专业化中使用 std::enable_if 的失败尝试遇到了编译错误:
template<typename A, typename B>
class<A3, enable_if<is_same<B, B3>::value, B3>::type>
{};
class A1; class A2; class A3; class B1; class B2; class B3;
/// Generic type
template <typename T1, typename T2>
class widget
{
static_assert(std::is_same<T1, A3>::value ^ !std::is_same<T2, B3>::value,
"Incompatible policy types selected.");
};
/// Some specialization
template <>
class widget<A1, A2>
{
};
widget<A1, B1> w11;
widget<A1, B2> w12;
widget<A2, B1> w21;
widget<A2, B2> w22;
widget<A3, B3> w33;
//widget<A1, B3> w13; // error C2338: Incompatible policy types selected.
//widget<A3, B2> w32; // error C2338: Incompatible policy types selected.
听起来您已经知道专门的模板。
无论如何,一个想法是为不兼容的类型定义一个专门的模板,该模板会自动抛出IncompatibleException
或其他东西。
因此,从技术上讲,用户可以定义类型,但它将不可用且完全明显。
简单的解决方案是为每个不兼容的情况进行专用化,并使其包含会触发编译错误的内容。像这样:
template <>
class widget<A1, B3> {
char error__policies_A1_and_B3_are_incompatible[0];
};
长度为 0 的 char 数组将抛弃编译器,并且"消息"将出现在编译错误的某个位置。
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- C++17中的并行执行策略
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 运行时执行策略不同
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 编译器上的策略数据结构不起作用
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- C++基于策略的设计:继承与组合
- C++,我可以禁止特定的策略组合吗?