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

10 c++ templates typedef type-traits

这个问题与c ++有关

有一个库声明了一个名为Solver <TS,FS>的类.求解器是另一个类域的成员(由我编写)

现在有很多域都有成员"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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后用它作为

Decider<region>::TS
Decider<region>::FS
Run Code Online (Sandbox Code Playgroud)

但是,这里由于if的范围,我猜结构是没用的.但是,我无法想到一个更好的方法来做到这一点.有什么建议?

所有不同的TS和FS都具有相同的接口.所以我不必担心内部代码.

Kir*_*sky 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;
};
Run Code Online (Sandbox Code Playgroud)


Pet*_*der 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;
};
Run Code Online (Sandbox Code Playgroud)

C++将根据region提供的选择使用哪个版本.

当然,您可以根据其他区域编号扩展此范围.


MSN*_*MSN 5

如果需要Decider根据某些编译时常量进行参数化,可以使用模板特化(参见其他答案).

如果需要Decider根据运行时值进行参数化,则必须将参数化region推迟到运行时.通常这是通过某种创建功能或工厂习惯来完成的.