编译绑定C ++模板的时间?

时间:2012-11-17 02:27:41

标签: c++ templates corba

我试图弄清楚如何让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以获得CC始终为CORBA::Any。但B取决于A(在编译时已知)。

我做了一些研究,看起来Boost::MPL::bind可能会做我需要的(我们已经需要Boost),但我不懂语法。它可以在宏中完成,但如果可以的话,我宁愿把它作为“真正的”模板。

有什么建议吗?

1 个答案:

答案 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总是需要一个类型,但是如果你得到的错误可能就是修复。