条件类型定义在C++中可能吗?

Are conditional typedef's possible in C++?

本文关键字:C++ 类型 定义 条件      更新时间:2023-10-16

这个问题与c++有关

存在一个库,该库声明了名为Solver<TS,FS>。解算器是另一类域的成员(由我编写)

现在有许多域有一个成员"int区域"

我想做的是,根据区域的值,我想让求解器接受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都具有相同的接口。所以我不必担心内部代码。

您可以为任何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;
};

您需要使用模板专业化。

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选择使用哪个版本。

当然,您可以将其扩展到其他区域编号。

如果需要根据某个编译时常数对Decider进行参数化,可以使用模板专用化(请参阅其他答案)。

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

请注意:

也可以使用type_trait boost::conditional对boost库执行此操作。

typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef;

condition仍然需要是一个计算结果为true或false的编译时表达式。这也使得你不需要为了几行差异而专门化整个类。