ファンクターと、または(C ++ 11の場合)名前空間からのテンプレートを使用して、ベクトルの要素の数をカウントするコードをref
作成しましたbind
。と名前空間を切り替えるためにを使用しています。Boostバージョン1.53を使用していて、コンパイルコマンドはです。gccバージョン4.7.2と4.6.3で試しましたが、両方で同じエラーが発生します。boost::
std::
#define
boost::
std::
g++ test.cpp -std=c++11
私は3つの質問があります:
- 例2で発生するエラーがわかりません。
- 名前空間を切り替えるだけで、このようなコードを移植可能にすることは可能ですか?
- 、、
std
およびboost
のバージョンの違いを詳細に説明している優れたリファレンスはありますか?(私はこの質問を見ましたが、答えは言及していませんまたは)bind
ref
function
ref
function
ありがとう!
PSこの例は私の問題を示しているだけです、私は知ってsize()
いますstd::vector
:-)
//#define USE_STD
#ifdef USE_STD
#include <functional>
using namespace std::placeholders;
namespace impl = std;
#else
#include <boost/version.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
namespace impl = boost;
#endif
#include <iostream>
#include <algorithm>
#include <vector>
class Item {
int id_;
public:
Item(int id) : id_(id) {};
};
template <typename ITEM>
class Counter {
int count_;
public:
// typedef void result_type; // adding this fixes Example 3 when impl=boost
Counter() : count_(0) {};
void operator()(ITEM* item) {count_++;}
int operator()() {return count_;}
};
//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
#ifndef USE_STD
std::cout << "BOOST_LIB_VERSION=" << BOOST_LIB_VERSION << std::endl;
#endif
// allocate
typedef std::vector<Item*> ItemVec;
ItemVec vec;
for (int i = 0; i < 9; ++i) {vec.push_back(new Item(i));}
// Example 1, works for BOTH
Counter<Item> f1;
f1 = std::for_each(vec.begin(), vec.end(), f1);
std::cout << "f1()=" << f1() << std::endl;
// Example 2, works with impl=std ONLY
// COMPILE ERROR with impl=boost: "no match for call to ‘(boost::reference_wrapper<Counter<Item> >) (Item*&)’"
Counter<Item> f2;
std::for_each(vec.begin(), vec.end(), impl::ref(f2));
std::cout << "f2()=" << f2() << std::endl;
// Example 3, works with impl=std ONLY
// COMPILE ERROR with impl=boost "no type named ‘result_type’ in ‘class Counter<Item>’"
// this can fixed by adding the typedef described above
Counter<Item> f3;
std::for_each(vec.begin(), vec.end(), impl::bind(impl::ref(f3), _1));
std::cout << "f3()=" << f3() << std::endl;
// clean up
for (ItemVec::iterator it = vec.begin(); it != vec.end(); ++it) {
delete *it;
}
vec.clear();
return 0;
}