Я пытаюсь выяснить, как заставить шаблон 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.
Таким образом, вы можете видеть, это Typesasts A
в B
получить C
, C
всегда CORBA::Any
, Но B
зависит от A
(известно во время компиляции).
Я провел некоторые исследования, и похоже, Boost::MPL::bind
может делать то, что мне нужно (а мы уже требуем Boost), но я не понимаю синтаксис. Все это можно было бы сделать в макросе, но я бы предпочел использовать его как «настоящие» шаблоны, если это возможно.
Какие-либо предложения?
Это лучше?
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
всегда нужен тип, но если вы получите ошибку, которая, вероятно, будет исправлена.
Других решений пока нет …