在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)
...
}
答案 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();
}