1

私は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> >'

それが何を意味するのかよくわかりません。どんな助けでも素晴らしいでしょう。ありがとう

4

2 に答える 2

0

私は使うだろう

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 << " ";
}
于 2013-07-04T23:05:23.173 に答える