2013-05-27 64 views
0

我最近嘗試boost :: mpl,它看起來既可怕又可怕。有時編譯錯誤信息相當混亂。boost編譯錯誤:: mpl ::標記<T> :: type

這一次,我在下面的代碼獲得的問題:

#include <iostream> 
#include <boost/type_traits/is_same.hpp> 
#include <boost/mpl/integral_c_tag.hpp> 
#include <boost/mpl/tag.hpp> 
#include <typeinfo> 
#include <boost/mpl/for_each.hpp> 
#include <boost/mpl/range_c.hpp> 
#include <boost/mpl/vector.hpp> 
#include <boost/mpl/copy.hpp> 

//使用元函數標籤<>收購類型,以便MPL只會輸出整數。

struct mpl_func2 
{ 
    template<typename T> 
    void operator()(T t) 
    { 
     if(boost::is_same<boost::mpl::tag<T>::type, boost::mpl::integral_c_tag>::value) 
     {cout<<t<<',';} 
    } 
}; 

以下是錯誤消息:

錯誤:在參數1模板參數列表中 '模板結構的boost :: is_same'

錯誤類型/值不匹配:預期型,得到了 '的boost :: MPL ::標籤::型'

回答

2

您應該使用

typename boost::mpl::tag<T>::type 

因爲typedependent-name。閱讀更多關於它的信息here

1

不幸的是,您正在混合編譯時和運行時編程的概念。

在Template Metaprogramming世界中,你可以使用類似enable_if(http://en.cppreference.com/w/cpp/types/enable_if)的東西來實現你想要的。

在該頁面中有很多示例說明如何根據編譯時類型選擇在運行時執行哪個實現。

我也建議閱讀戴夫亞伯拉罕的MPL書(http://www.amazon.com/Template-Metaprogramming-Concepts-Techniques-Beyond/dp/0321227255)。

一旦你瞭解MPL,你將能夠開發高度優化的程序。

+0

當然,最好不要比if(false)... –

+0

實際上,有時運行時的'if(某個constexr)'比純元編程更合適。 –