簡體   English   中英

Boost mpl轉換序列“真實”類型

[英]Boost mpl transformed sequence “real” type

請參閱boost mpl轉換文檔中的以下代碼:

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只是比較以下兩個序列的元素而不是整個序列類型本身。 我不明白為什么以下失敗:

BOOST_STATIC_ASSERT(( std::is_same<result,pointers>::value )); //< assert fails

為什么結果類型與“指針”類型不完全相同? 我假設這是某種程度上因為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

“實際上”當它不是帶指針的is_same時?

再次感謝@llonesmiz為使用typeid()打印類型的代碼,這有助於理解發生了什么。

所以看起來真正的結果類型取決於編譯器(可能是boost #ifdefs),intel編譯器和visual studio將其轉換回std :: vectorN <>,其中最大N是boost中的預定義數字(因此它不起作用時N太大了)。 對於g ++,會生成一個受損的類型(甚至是我的轉換調用中的兩種不同類型)。

所以我想通過mpl :: equal檢查類型很好(檢查范圍的元素)。 如果所有類型都應該“真正”等效(std :: is_same成立),我猜你需要手動將結果轉換為可變參數模板類std :: tuple。

請參閱http://liveworkspace.org/code/3l8O9K $ 16 代碼示例

或簡而言之:

template < class T, class R >
struct ToStdTuple;

template < class... TTypes, class X >
struct ToStdTuple< std::tuple< TTypes... >, X >
{
  typedef std::tuple< TTypes..., X > type;
};

然后

// typedef mpl::vector<char,short,int,long,float,double> types;
// typedef mpl::transform< types,boost::add_pointer<mpl::_1> >::type result;

typedef mpl::fold< result, std::tuple<>,
  ToStdTuple< mpl::_1, mpl::_2 > >::type result_normalized;

導致

std::tuple<char*, short*, int*, long*, float*, double*>

對於所有轉換調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM