boostmpl変換ドキュメントの次のコードを参照してください。
typedef vector<char,short,int,long,float,double> types;
typedef vector<char*,short*,int*,long*,float*,double*> pointers;
typedef transform< types,boost::add_pointer<_1> >::type result;
BOOST_STATIC_ASSERT(( equal<result,pointers>::value ));
boost::mpl
型システムと「実際にどのように機能するか」を理解したい。私が理解mpl::equal
しているように、シーケンスタイプ全体ではなく、次の2つのシーケンスの要素を比較するだけです。次のことが失敗する理由がわかりません。
BOOST_STATIC_ASSERT(( std::is_same<result,pointers>::value )); //< assert fails
結果タイプが「ポインタ」タイプと100%同一ではないのはなぜですか?mplが変換を怠惰に実行しているため、または結果が単なるシーケンスであり、ベクトルではなくなったためだと思いますか?どういうわけか、mplを怠惰にせず、100%同一の型を取得することは可能ですか(この結果を使用して自分で変換関数を作成できますが、mplでそれを行う方法を知りたいです)?
たとえば、結果を新しいベクトルに挿入するなど、すでにいくつかのことを試しましたが、成功しませんでした。
BOOST_STATIC_ASSERT(( std::is_same<
mpl::insert_range< mpl::vector<>, mpl::begin<mpl::vector<> >::type,
result >::type, pointers >::value )); //< assert fails too
また、変換関数でback_insertを使用しようとしましたが、これも失敗します。
typedef transform< types,boost::add_pointer<_1>,
mpl::back_inserter< mpl::vector< > > >::type result_new;
BOOST_STATIC_ASSERT(( std::is_same<result_new,pointers>::value )); //< fails...
「ドキュメント」を読んでも役に立ちませんでした。繰り返しになりますが、mpl変換(または他の変換シーケンス関数)で100%同一の型を取得することは可能ですか?そして、タイプの結果は何ですか
result
「実際には」それがポインタと同じでない場合は?