0

我试图弄清楚如何让 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.

所以你可以看到,它类型转换ABget CC总是CORBA::Any。但B取决于A(在编译时已知)。

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

有什么建议么?

4

1 回答 1

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

于 2012-11-17T02:47:54.297 回答