全局bool变量和模板

时间:2013-02-06 16:04:54

标签: c++ templates

在c ++类中,我在构造函数中设置了一个全局bool变量* const_var *,并在其他地方保持不变;并且在我的类中有很多 if condition 这个变量,为了优化代码,我想使用模板es: template< bool const_var> X<的实例对象真> ()

我该怎么办? 感谢的

这里是一个没有模板的简单类:

.h文件

class X {
public:
bool const_var;

X(bool b);
void method1();

void method2();
void method3();
};

.cpp文件

X::X(bool b){
const_var=b; //unchanged elsewhere
}

void X::method1(){
 ...
 if(const_var==true)
 ...
 if(const_var==false)
 ...
}

void X::method2(){
 ...
 if(const_var==true)
 ...
 if(const_var==true)
 ...
}

void X::method3(){
 ...
 if(const_var==false)
 ...
 if(const_var==true)
  ...
}

2 个答案:

答案 0 :(得分:0)

您必须将类定义更改为类模板定义:

template <bool const_var>
class X
{
public:
  X();
  void method1();
  void method2();
  void method3();
};

在实施中,您将执行:

template <bool const_var>
X<const_var>::X() {}

template <bool const_var>
X<const_var>::method1()
{
  //...
  if (const_var)
  //...
  if (!const_var)
  //...
}

//dtto for method2 and method3

编译器将优化if

但是,必须明确地实例化模板,或者必须在使用它们的每个翻译单元中提供它们的定义。这意味着您必须 将函数体移动到头文件中,将以下行添加到.cpp中:

template class X<true>;
template class X<false>;

另请注意,当您将X更改为类模板时,X将不再是类型;只有X<true>X<false>是类型。这意味着您不能,例如,声明变量X x1(true);,它必须是例如X<true> x1;

答案 1 :(得分:0)

我认为模板最适用于此处。你有一个假装是基于常量布尔值的2个不同东西的对象。你为什么不把X分成两个不同的对象?

class Thing
{
   public:
       virtual ~Thing(){}
       virtual method1() = 0;
       virtual method2() = 0;
       etc...
 };

 class TrueThing : public Thing
 {
    virtual method1(){//performs true branch}
    virtual method2(){//true branch}
 }
 class FalseThing : public Thing
 {
    virtual method1(){//performs false branch}
    etc...
 }

 void main()
 {
     TrueThing true_thing;
     FalseThing false_thing;
     true_thing.method1();
     false_thing.method1();
 }
相关问题