我正在使用模板进行优化 - 函数模板有一个积分参数,一个开关用于解决条件一次,而实际函数包含一些繁重的处理,否则需要多次解决条件。例如:
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个问题:
C1
和C2
实际上是作为参数发送的,我假设为4B空结构,但它仍然浪费空间。我想像这样打电话给Fn:
Fn<TT0::Type, TT1::Type>(param);
但我得到很多错误,比如错过';'等等。知道为什么吗?