C++ 模板参数互斥
我有一个具有多个模板参数的模板C++ 模板参数互斥,c++,templates,C++,Templates,我有一个具有多个模板参数的模板 template<typename Appl, typename StoredData> class Box { }; 这些参数的值是互斥的: i、 e.对于Appl的每个值,StoredData只允许有一组特定的类型 例如:Appl是List,StoredData-double,char Appl是树,StoredData-int 有没有办法在编译时强制执行此限制? 所以 是的,有: template<typename
template<typename Appl, typename StoredData>
class Box {
};
这些参数的值是互斥的:
i、 e.对于Appl的每个值,StoredData只允许有一组特定的类型
例如:Appl是List,StoredData-double,char
Appl是树,StoredData-int
有没有办法在编译时强制执行此限制?
所以
是的,有:
template<typename Appl, typename StoredData>
class Box {
static_assert(
std::is_same<Appl, List>::value && std::is_same<StoredData, double>::value ||
std::is_same<Appl, Tree>::value && std::is_same<StoredData, int>::value,
"Bad parameters"
);
};
下面是一个工作示例,尝试更改某些类型,它将无法编译。是的,有:
template<typename Appl, typename StoredData>
class Box {
static_assert(
std::is_same<Appl, List>::value && std::is_same<StoredData, double>::value ||
std::is_same<Appl, Tree>::value && std::is_same<StoredData, int>::value,
"Bad parameters"
);
};
下面是一个工作示例,尝试更改某些类型,它将无法编译。只需使用Appl类型并使用部分专用化创建自定义映射即可。+静态断言可以很好地实现。或者只需将StoredData类型设置为Appl类型的内部typedef,并执行typedef typename Apply::stored_data_type store_type;。如果你愿意,我可以在以后写下这两个选项的答案。只需使用Appl类型并使用部分专用化创建自定义映射即可静态断言可以很好地实现。或者只需将StoredData类型设置为Appl类型的内部typedef,并执行typedef typename Apply::stored_data_type store_type;。如果你愿意,我可以在后面写下这两个选项的答案。另外请注意,这可以在C++11中进行推广,以使有效的StoredData类型的列表具有Appl-to组合,从而可以减少锅炉板代码。谢谢。我想那会有用的。但我只是想知道,如果我可以部分专注于App1,是否会有一种更干净的方法来做到这一点,而不必明确地说明所有选项。@excalibur:这取决于你想要在更高的层次上实现什么,而不仅仅是让它在某个类型上工作。你没说你想做什么,所以我没办法。虽然回答了您的问题,但我确信这并不是您问题的解决方案。还要注意的是,这可以在C++11中进行推广,将Appl组合到有效存储数据类型的列表中,以便减少锅炉板代码。谢谢。我想那会有用的。但我只是想知道,如果我可以部分专注于App1,是否会有一种更干净的方法来做到这一点,而不必明确地说明所有选项。@excalibur:这取决于你想要在更高的层次上实现什么,而不仅仅是让它在某个类型上工作。你没说你想做什么,所以我没办法。虽然回答了你的问题,但我相信这不是解决你问题的办法。