сообщение об ошибке boost :: phoenix при использовании в качестве функтора

Я пытаюсь изучить boost :: phoenix и пытаюсь использовать его в std :: transform, как показано ниже.

class myClass
{
int i;

public:
getNumber();
setNumber(int j);
};

int main()
{
std::vector<myClass*> vect
std::vector<int> numVect

numVect.resize(vect.size());
using boost::phoenix::arg_names::arg1;
std::transform (vect.begin(), vect.end(), numVect.begin(), arg1->getNumber());
}

Но я получаю ошибку error: base operand of '->' has non-pointer type 'const boost::phoenix::actor<boost::phoenix::argument<0> >'

Я не совсем уверен, что это значит. Любая помощь будет отличной. Спасибо

1

Решение

Как вы заметили выше, способ сделать это с Фениксом с phoenix::bind или с ->* как вы делаете выше:

#include <vector>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/range/algorithm/transform.hpp>

class myClass
{
int i;

public:
int getNumber() { return i; }
void setNumber(int j) { i = j; }
};

int main()
{
std::vector<myClass*> vect;
std::vector<int> numVect;

using boost::phoenix::arg_names::arg1;
boost::transform(vect,
std::back_inserter(numVect),
(arg1->*&myClass::getNumber)());
}

Феникс может быть сложным, и выражения связывания являются одними из наиболее запутанных и надуманных из синтаксических искажений Феникса, но, честно говоря, это не кажется таким уж плохим.

Кстати, полиморфные лямбды в C ++ 14 откажутся от большей части Феникса.

2

Другие решения

Я бы использовал

std::transform (vect.begin(), vect.end(), numVect.begin(), phx::bind(&myClass::getNumber, arg1));

Или, если вы хотите более хороший синтаксис:

auto getNumber = phx::lambda [ phx::bind(&myClass::getNumber, arg1) ];
std::transform (vect.begin(), vect.end(), numVect.begin(), getNumber(arg1));

Демо-версия:

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

namespace phx = boost::phoenix;

struct myClass
{
int i;

int getNumber() const { return i; }
void setNumber(int j) { i = j; }
};

using namespace boost::phoenix::arg_names;
static const auto getNumber = phx::lambda [ phx::bind(&myClass::getNumber, arg1) ];

int main()
{
const std::vector<myClass*> vect { new myClass{1}, new myClass{2}, new myClass{42} };
std::vector<int> numVect(vect.size());

// puritan/standard version:
std::transform (vect.begin(), vect.end(), numVect.begin(), std::mem_fn(&myClass::getNumber));

// just bind:
std::transform (vect.begin(), vect.end(), numVect.begin(), phx::bind(&myClass::getNumber, arg1));

// using more natural syntax
std::transform (vect.begin(), vect.end(), numVect.begin(), getNumber(arg1));

for(auto i : numVect)
std::cout << i << " ";
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector