2013-03-13 41 views
3

使用現有的Boost Phoenix(佔位符)參數(例如_1),我可以使用數組/下標運算符。例如,以下摘錄將顯示1使用Boost C++ Phoenix用戶定義參數的下標運算符[]錯誤

int arr[4] = {1,2,3,4}; 
std::cout << _1[0](arr) << std::endl; 

但是,如果我定義自己的佔位符參數:

phoenix::actor<phoenix::expression::argument<1>::type> const my_1 = {{}}; 

雖然它工作正常縵(以下輸出7):

std::cout << my_1(7) << std::endl; 

,如果我嘗試使用下標運算符(如上):

std::cout << my_1[0](arr) << std::endl; 

我收到很多錯誤;總之,在G ++ 4.7.2中,模板參數推導失敗;與Clang 3.2,我被告知函數不能返回數組類型。

如何讓我的鳳凰佔位符參數支持下標運算符?

回答

5

剛剛擺脫actor部分,它工作正常:

#include <iostream> 
#include <boost/phoenix.hpp> 

int main() 
{ 
    namespace phx = boost::phoenix; 

    phx::expression::argument<1>::type const my_1 = {{{}}}; 
    int arr[4] = { 1, 2, 3, 4 }; 
    std::cout << my_1[0](arr) << '\n'; 
} 

Online demo

+0

我看到'decltype(PHX :: arg_names :: _ 1)'同樣適用,雖然類型顯然是'const類型'。奇怪的是,decltype(phx :: arg_names :: _ 2)'也是如此。 – user2023370 2013-03-14 21:00:53

+0

@ user2023370:除了它所在的範圍之外,'phx :: arg_names :: _ 1'的聲明與'my_1'的聲明完全相同,所以我當然希望這會起作用。 ; - ] – ildjarn 2013-03-14 21:14:16

+0

好的。這只是我發現這個失敗:'static_assert(std :: is_same :: type,decltype(phx :: arg_names :: _ 1)> :: value,「」);' – user2023370 2013-03-14 21:29:52

相關問題