Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是条件类型定义';在C++;?_C++_Templates_Typedef_Typetraits - Fatal编程技术网

C++ 是条件类型定义';在C++;?

C++ 是条件类型定义';在C++;?,c++,templates,typedef,typetraits,C++,Templates,Typedef,Typetraits,这个问题与c有关++ 有一个库声明了一个名为Solver的类。解算器是另一个类域的成员(由我编写) 现在有许多域有一个成员“int region” 我想做的是根据region的值,让解算器接受TS和FS的不同参数。 我在想一些事情 template<int region> struct Decider { if(region==1) { typedef TSA TS; typedef FSA FS; } else if(region==2)

这个问题与c有关++

有一个库声明了一个名为Solver的类。解算器是另一个类域的成员(由我编写)

现在有许多域有一个成员“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;
  }
}
模板
结构决策器
{
如果(区域==1)
{
typedef-TSA-TS;
typedef-FSA-FS;
}
其他的
如果(区域==2)
{
类型定义TSB TS;
类型定义FSB FS;
}
}
然后将其用作

Decider<region>::TS
Decider<region>::FS
Decider::TS
决策者:FS
然而,这里由于if的范围,我想结构是无用的。然而,我想不出更好的方法来做到这一点。有什么建议吗


所有不同的TS和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;
};
模板
结构决策器;
模板
结构决策器
{
typedef-TSA-TS;
typedef-FSA-FS;
};
模板
结构决策器
{
类型定义TSB TS;
类型定义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;
};
模板
结构决策器;
模板
结构决策器
{
typedef-TSA-TS;
typedef-FSA-FS;
};
模板
结构决策器
{
类型定义TSB TS;
类型定义FSB FS;
};
C++将根据提供的
区域
选择要使用的版本


当然,您可以根据您认为适合其他区域编号的情况对其进行扩展。

如果您需要基于某个编译时常量参数化
决策器,您可以使用模板专门化(请参阅其他答案)


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

请注意,现在遇到这种情况的人:

也可以通过使用的boost库实现这一点

typedef boost::条件MyTypeDef;

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

应该注意的是,模板参数必须是编译时常量。既然OP说他想使用一个成员变量
int region
作为参数,我担心这个解决方案无法满足它的需要…(当然,我可能误解了这个问题。)是的。。。。最好将其作为int区域,但我想我可以使用编译时常量tooo来管理。我想这会让代码变长……只是为了确保我能像这样做对吗<代码>使用Decider::TS;解算器()
@Jayesh Badwaik,没有,但是你可以写
typedef Decider::TS;解算器其中的
区域
是编译时常量。
using
关键字用于使用名称空间。假设我需要一个region=1的定义和另一个region!=1那么,有可能吗?真是太棒了!!:-)
typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef;