1

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

我能怎么做?谢谢

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

.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)
  ...
}
4

2 回答 2

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

ifs 将由编译器优化。

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

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

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

于 2013-02-06T16:21:53.923 回答
0

我不认为模板最适合在这里应用。您有一个基于常量布尔值假装为 2 个不同事物的对象。你为什么不把 X 分成 2 个不同的对象呢?

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();
 }
于 2013-02-06T16:26:19.387 回答