2013-07-22 78 views
0

我想在编译时使用模板非类型参数来自动分支代码。即例如:模板非类型参数:编译时检查条件

template<std::size_t TDimension> 
class A 
{ 
public: 
    A() 
    {} 

    ~A() 
    {} 

    void print() 
    { 
     if(TDimension == 3) 
      std::cout << "My dimension is 3" << std::endl; 
     else if(TDimension == 2) 
      std::cout << "My dimension is 2" << std::endl; 
    } 
}; 

上面的代码在运行时分支代码。问题是:如何在编译时启用它以提高性能?

+2

你已经测量这个代码的性能?没有?那么如何在改变它时改进性能?没有需要改进的地方你就无法改进。 (别担心,编译器已经为你做了优化。) –

+0

恒定表达式和死区消除是真正低悬优化的果实。有理由想要一个真正的编译时分支,但通常会涉及“如果参数错误,其他分支甚至不会编译”。 – Yakk

回答

3

由于两个TDimension和你比较,它的值是恒定的,编译器只生成if没有运行时比较的一个分支,只要你能优化。

可以肯定的,你可以明确地专门来代替:

template<std::size_t TDimension> 
class A 
{ 
public: 
    void print() {} 
    // or void print(); to give an error for an handled value 
}; 

template <> void A<3>::print() {std::cout << "My dimension is 3" << std::endl;} 
template <> void A<2>::print() {std::cout << "My dimension is 2" << std::endl;} 
+0

你的代码并没有给出一个愚蠢的程序员告诉它该死的东西 - 它总是在第三维;) – nijansen

+0

完美。这就是我要找的。 – kstn