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.

ご覧のとおり、を取得するためにタイプキャストABます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 に答える