Как использовать std::map с boost::phoenix?

Как я могу использовать std::map внутри лямбда-функции Phoenix?

#include <boost\phoenix.hpp>
#include <map>

int main() {
    using namespace boost::phoenix;
    using namespace boost::phoenix::arg_names;
    using namespace std;
    map<int, int> m;
    auto foo = at(m, 3);
    foo();
}

Почему это не работает? Я получаю следующую ошибку:

C2440   'return': cannot convert from 'int' to 'std::pair<const _Kty,_Ty> ' xxx c:\lib\boost\phoenix\stl\container\container.hpp    167

В настоящее время я использую сообщество Visual Studio 2015 и библиотеку Boost 1.60.


person ly000    schedule 11.04.2016    source источник
comment
прочитайте эту ссылку и опубликуйте приемлемый пример кода: stackoverflow.com/help/mcve   -  person xaxxon    schedule 11.04.2016
comment
Теперь это выглядит хорошо?   -  person ly000    schedule 11.04.2016
comment
Вероятно, он использует std::map<int,int>::value_type для определения типа результата, который является std::pair<const int,int>, тогда как std::map<int,int>::at просто возвращает ссылку на отображаемый тип, т. е. int& или int const&.   -  person Dan Mašek    schedule 11.04.2016
comment
Можно ли это исправить? Я думал, что феникс поддерживает все основные контейнеры std.   -  person ly000    schedule 11.04.2016
comment
В частности, строка 160 или строка 173. Может баг? Специализация шаблона для std::map должна решить эту проблему. Вместо этого используйте ссылку или const_reference. Странно, что они этого еще не сделали...   -  person Dan Mašek    schedule 11.04.2016
comment
Сейчас у меня нет времени проверять, но я думаю, что этот вопрос аналогичен.   -  person llonesmiz    schedule 11.04.2016


Ответы (1)


На основе вопроса, указанного jv_:

Вместо использования функции at используйте operator[].

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

int main() {
    std::map<int, int> m;
    m[3] = 33;
    auto foo = boost::phoenix::ref(m)[3];
    std::cout << foo() << "\n";
}

Похоже, что реализация at отложенной функции phoenix использует value_type [1] [2], чтобы определить тип результата, который в данном случае является std::pair<const int,int>. Однако std::map<int,int>::at просто возвращает reference или const_reference.

person Dan Mašek    schedule 11.04.2016
comment
стоит отметить, что у него есть ограничение, заключающееся в том, что он не будет работать с cref(m), потому что operator[] является неконстантной операцией. - person sehe; 11.04.2016
comment
@sehe Хороший вопрос. Фрэнки, я не понимаю, почему они реализовали это таким образом, когда любой Container должен иметь reference и const_reference. Но я мог что-то упустить... - person Dan Mašek; 11.04.2016