まず、バインダー機能を使用するには機能を含める必要があります。
次に、operator() を const に指定する必要があります。
3 番目に、*first_argument_type* などの型特性情報を取得するには、std::binary_function から継承するのが最善です。
#include <algorithm>
#include <vector>
#include <functional>
#include <iterator>
#include <iostream>
struct F : public std::binary_function<int, int, int>
{
int operator()(int a, int b) const
{
return a * b;
}
};
int main(void)
{
std::vector<int> bases;
for(int i = 0; i < 5; ++i)
bases.push_back(i);
std::transform(bases.begin(), bases.end(), bases.begin(), std::bind2nd(F(), 2));
// print it to stdout
std::copy(bases.begin(), bases.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
編集
C++11 対応のコンパイラと stdlib にアクセスできる場合は、ベクトル充填コードを次のように簡単に書き換えることができます。
std::vector<int> bases(5);
int i = 0;
std::generate(bases.begin(), bases.end(), [&i]() { return ++i; });
C++11 では、新しいバインダー (boost::bind から移動) std::bind があります。これははるかに柔軟であり、必要に応じて試してみてください。そのような:
using namespace std::placeholders;
std::transform(std::begin(bases), std::end(bases), std::begin(bases),
std::bind(F(), 2, _1));
(以下の回答から、a.lasram が新しい std::bind について言及していることがわかりました。プロジェクトなどで、代わりに新しい C++ 11 を使用することが許可されているかどうかはわかりません。古い C++03 の機能. もし私があなただったら、あなたが許可されていないなら、それなら (有名な Mr. Alexandrescu からの引用) "あなたのエージェントに電話してください." :) )
ところで。Ryan (コメントを参照) は、私の最も精巧な std::generate でさえ ;) を使用して短く書くことができると述べたとき、絶対に正しいですiota
:
std::iota(bases.begin(), bases.end(), 1);
std::iota はnumericで定義されています。したがって、それも含める必要があります。
それが役立つことを願っています。