这个问题与c ++
有关有一个库声明了一个名为Solver<的类。 TS,FS>。 Solver是另一个类Domain(由我编写)的成员
现在有很多域都有成员“int region”
我想要做的是取决于region的值,我想让求解器接受TS和FS的不同参数。 我在考虑一些事情
template<int region>
struct Decider
{
if(region==1)
{
typedef TSA TS;
typedef FSA FS;
}
else
if(region==2)
{
typedef TSB TS;
typedef FSB FS;
}
}
然后将其用作
Decider<region>::TS
Decider<region>::FS
但是,这里由于if的范围,我猜结构是没用的。但是,我无法想到一个更好的方法来做到这一点。有什么建议吗?
所有不同的TS和FS都具有相同的接口。所以我不必担心内部代码。
答案 0 :(得分:16)
您可以为任何region
值专门设置模板。
template<int region>
struct Decider;
template<>
struct Decider<1>
{
typedef TSA TS;
typedef FSA FS;
};
template<>
struct Decider<2>
{
typedef TSB TS;
typedef FSB FS;
};
答案 1 :(得分:9)
您需要使用模板专业化。
template <int region>
struct Decider;
template <>
struct Decider<1>
{
typedef TSA TS;
typedef FSA FS;
};
template <>
struct Decider<2>
{
typedef TSB TS;
typedef FSB FS;
};
C ++将根据提供的region
选择要使用的版本。
当然,您可以根据其他区域编号扩展此范围。
答案 2 :(得分:5)
如果需要根据某些编译时常量参数化Decider
,可以使用模板专门化(参见其他答案)。
如果需要根据Decider
的运行时值参数化region
,则必须将参数化推迟到运行时。通常这是通过某种创造功能或工厂习惯来完成的。
答案 3 :(得分:2)
现在有人注意到这一点:
也可以使用type_trait boost::conditional。
对boost库执行此操作typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef;
condition
仍然需要是一个计算结果为true或false的编译时表达式。这也使得你不需要专门研究整个班级,只需要几行差异。