定义了函数模板参数类型,但未实际指定参数

时间:2015-02-15 20:43:44

标签: c++ function templates

我正在使用模板进行优化 - 函数模板有一个积分参数,一个开关用于解决条件一次,而实际函数包含一些繁重的处理,否则需要多次解决条件。例如:

 template<int value> struct MIntValue 
 { static const int Value = value; typedef MIntValue Type; };

#define MTSWITCH3(index, value, command) \
switch(value) {\
    case 0: { MIntValue<0> T##index; typedef MIntValue<0> TT##index; command; }; break;\
    case 1: { MIntValue<1> T##index; typedef MIntValue<1> TT##index; command; }; break;\
    case 2: { MIntValue<2> T##index; typedef MIntValue<2> TT##index; command; }; break;\
    default: ASSERT(0);\
};

 template<class C1, class C2> void Fn(C1 c1, C2 c2, int param) 
 { for (int i=0; i<10000000; i++) 
      if (C1::Value == 0 && C2::Value == 1) { do something; };
 };

MTSWITCH3(0, condition1,
     MTSWITCH3(1, condition2,
        Fn(T0, T1, param);

因此,基本上在编译器实际调用之前执行实际切换,并且每个参数组合创建一个函数。在发布模式下,函数内部的条件由编译器解析,因为它们只是常量。

我还有2个问题:

  1. C1C2实际上是作为参数发送的,我假设为4B空结构,但它仍然浪费空间。我想像这样打电话给Fn:

    Fn<TT0::Type, TT1::Type>(param);
    
  2. 但我得到很多错误,比如错过';'等等。知道为什么吗?

    1. 当条件数量很少时,如1-4,我可以为开关写一个宏。但如果说有100种可能性,我真的不打算做那样的转换。有任何想法如何用模板实现这样的开关?我可能会通过某种宏二叉树来做到这一点,但像这样的宏很难管理​​。

0 个答案:

没有答案