在C ++中是否可以使用条件typedef?

时间:2011-06-14 18:46:26

标签: c++ templates typedef typetraits

这个问题与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都具有相同的接口。所以我不必担心内部代码。

4 个答案:

答案 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的编译时表达式。这也使得你不需要专门研究整个班级,只需要几行差异。