我是元编程的完全菜鸟,我的问题很简单,但我没有找到一个简单的答案。类似的问题得到回答here但我无法将其转化为我的需求。< / p>
我有一个这样的课程
class Program {
public:
Program(){}
SetMatrixUniform(){
CallSomeMethodX();
}
~Program(){}
};
但是我有这样的场景,我需要使用相同方法的相同类,但在他们的身体中调用不同的函数。这样的事情:
class Program {
public:
Program(){}
SetMatrixUniform(){
CallSomeMethodY();
}
~Program(){}
};
我希望有一个带有“true”参数的类的模板接口,以选择在编译时放入类成员方法的内容,而不是维护2个这样的类。
类似的东西:
Program<true> myProg; ///expands CallSomeMethodX(); into SetMatrixUniform()
while:
Program<false> myProg; ///expands CallSomeMethodY(); into SetMatrixUniform()
我已经看到了声明类变体的示例,然后通过专门化,最终类扩展了其中一个。我想在不使用继承的情况下执行它,因为性能在这里非常重要。
答案 0 :(得分:2)
这可以使用模板专业化
来解决我们首先将Programm
声明为带有bool参数的模板:
template<bool B>
struct Programm
{
struct SetMatrixUniform()
{
std::cout << "General / Generic Implementation" << std::endl;
}
};
现在我们可以为更具体的案例提供另一种实现/专业化,例如B == true
template<>
struct Programm<true>
{
void SetMatrixUniform()
{
std::cout << "Sepcific Implementation For B == true" << std::endl;
}
};
由于bool
只能包含两种状态:true和false,如果模板使用false实例化,则使用第一个实现,如果模板使用true进行实例化,则使用第二个实现。
然而,这个解决方案有点冗长,需要您重新实现大部分功能。如果您只是在某些方法中需要不同的行为,您也可以直接比较B
。 E.g:
template<bool B>
struct Programm
{
void SetMatrixUniform()
{
if(B == true)
//...
else
//...
}
};