2013-03-13 2 views
3

С существующим аргументом Boost Phoenix (placeholder), например _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, мне сказали, что функция не может вернуть тип массива.

Как я могу использовать аргумент-заполнитель Phoenix для оператора индекса?

ответ

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 type'. Как ни странно, это также относится к 'decltype (phx :: arg_names :: _ 2)'. – user2023370

+0

@ user2023370: Объявление 'phx :: arg_names :: _ 1' идентично объявлению' my_1', кроме области, в которой оно находится, поэтому я, безусловно, надеюсь, что это сработает. ; -] – ildjarn

+0

Хорошо. Просто я обнаружил, что это не удалось: 'static_assert (std :: is_same :: type, decltype (phx :: arg_names :: _ 1)> :: value," ");' – user2023370

 Смежные вопросы

  • Нет связанных вопросов^_^