使用C ++模板有条件地插入方法的主体

时间:2014-04-02 11:05:01

标签: c++ templates metaprogramming

我是元编程的完全菜鸟,我的问题很简单,但我没有找到一个简单的答案。类似的问题得到回答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()

我已经看到了声明类变体的示例,然后通过专门化,最终类扩展了其中一个。我想在不使用继承的情况下执行它,因为性能在这里非常重要。

1 个答案:

答案 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
            //...
    }
};