2011-11-23 69 views
1

我一直在尋找一個MPL類,它將從一個性能足夠好的MPL元函數類中創建一個函數對象。我手卷此實現:從MPL元函數類創建一個函子

template <class Lambda, class Result> 
    struct functor 
    { 
     typedef Result result_type; 

     template <typename Type> 
     Result operator()(Type) 
      { return Lambda::template apply<Result>::type::value; } 
    }; 

的利用方法是

Foo foo; 
    return functor< boost::mpl::always<boost::mpl::int_<5> >, int >(foo); 

爲寫return 5的榮耀版本。

由於這個操作看起來很基本,我以爲MPL中已經有了類似的類,但是對文檔的搜索並沒有給我帶來任何幫助。我錯過了什麼嗎?

+0

在閱讀澄清意見,增強融合可能是你在找什麼。它是這樣做的:融合了元運算和運行時編程(注意Fusion帶有它自己的序列(和派生)概念。但是,MPL序列僅適用於 – sehe

回答

1

我不認爲在Boost.MPL中有這樣的類,因爲它們專注於編譯時計算。這種包裝器寧願保存在Boost.Fusion中,它旨在使編譯和運行時實體之間建立鏈接,但我沒有找到任何東西。

我認爲你將不得不使用你自己的實現,這看起來好像一眼就可以了(儘管我寧願使用mpl::apply來處理佔位符表達式)。我想你也可以省略返回類型,因爲它可以從lambda推導出來。

下面是使用apply,並從拉姆達推斷返回類型的替代實現:

template < typename Lambda > 
struct functor 
{ 
    template < typename Type > 
    typename boost::mpl::apply< Lambda, Type >::type::value_type 
    operator()(Type) 
    { 
     return boost::mpl::apply< Lambda, Type >::type::value; 
    } 
}; 

// sample use: 
int main() 
{ 
    boost::mpl::int_<5> five; 
    std::cout << functor< boost::mpl::identity<boost::mpl::_> >()(five); 
    // Output "5" 
} 
+0

......除了例如http://www.boost.org/ doc/libs/1_48_0/libs/mpl/doc/refmanual/for-each.html – sehe

+0

@sehe:你是對的,我忘了'for_each'(我必須承認我從來沒有用過它)。 –