我试图弄清楚如何让C ++模板使用查找表来执行其功能,但是在编译时不是运行时。我无法将其写入单词,所以这是一个示例,以及我到目前为止的丑陋模板+预处理器宏组合:
template<class T_POD, class T_Corba>
inline void c_to_corba_base(T_POD &In, CORBA::Any &Out) {
Out <<= static_cast<T_Corba>(In);
}
#define C_TO_CORBA_PAIR(T_POD, T_CORBA) \
inline void c_to_corba(T_POD &In, CORBA::Any &Out) { \
c_to_corba_base<T_POD, T_CORBA>(In, Out); \
}
C_TO_CORBA_PAIR(short, CORBA::Short)
C_TO_CORBA_PAIR(long, CORBA::Long)
C_TO_CORBA_PAIR(double, CORBA::Double)
// etc.
所以你可以看到,它将A
转换为B
以获得C
。 C
始终为CORBA::Any
。但B
取决于A
(在编译时已知)。
我做了一些研究,看起来Boost::MPL::bind
可能会做我需要的(我们已经需要Boost),但我不懂语法。它可以在宏中完成,但如果可以的话,我宁愿把它作为“真正的”模板。
有什么建议吗?
答案 0 :(得分:1)
这样更好吗?
template<typename> struct CorbaTypeMap;
template<> struct CorbaTypeMap<short> { typedef CORBA::Short type; };
template<> struct CorbaTypeMap<long> { typedef CORBA::Long type; };
template<> struct CorbaTypeMap<double> { typedef CORBA::Double type; };
template<typename T_POD>
inline void c_to_corba(T_POD &In, CORBA::Any &Out) {
Out <<= static_cast< /* typename */ CorbaTypeMap<T_POD>::type >(In);
}
我认为你不需要那个typename
关键字,因为static_cast
总是需要一个类型,但是如果你得到的错误可能就是修复。