Время компиляции привязки шаблона C ++?

Я пытаюсь выяснить, как заставить шаблон 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), но я не понимаю синтаксис. Все это можно было бы сделать в макросе, но я бы предпочел использовать его как «настоящие» шаблоны, если это возможно.

Какие-либо предложения?

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 всегда нужен тип, но если вы получите ошибку, которая, вероятно, будет исправлена.

1

Другие решения

Других решений пока нет …