私は私のクラスFooのスマートptrのベクトルを持っています:
struct Foo
{
Foo() : mEnabled( false ) {}
bool mEnabled;
bool isEnabled() const { return mEnabled; }
void setEnabled( bool inEnabled ) { mEnabled = inEnabled; }
/* ... */
};
typedef std::tr1::shared_ptr< Foo > tFooPtr;
typedef std::vector< tFooPtr > tFooVec;
私はこれをうまく機能させています:
tFooVec foo_vector; // insert couple of elements
size_t count = count_if( foo_vector.begin(), foo_vector.end(), std::tr1::mem_fn( &Foo::isEnabled ) );
しかし、「無効にされた」Fooオブジェクトをcount_ifしたいときに使用する機能的な「ヘルパー」
size_t count = count_if( foo_vector.begin(), foo_vector.end(), std::not1( std::tr1::mem_fn( &Foo::isEnabled ) ) ); // does not compile
上記の行はコンパイルされません:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:446: error: no match for call to '(std::unary_negate<std::tr1::_Mem_fn<bool (Foo::*)()const> >) (std::tr1::shared_ptr<Foo>&)'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_function.h:322: note: candidates are: bool std::unary_negate<_Predicate>::operator()(const typename _Predicate::argument_type&) const [with _Predicate = std::tr1::_Mem_fn<bool (Foo::*)()const>]
make: *** [src/shared_ptr_tests.o] Error 1
(Linuxでg ++ 4.1.2を使用)
コンパイルの問題は、関数/述語が提供されていることを必要とするをstd::not1
使用しているという事実に起因すると思います。後者は、述語がため息から派生したときに与えられますstd::unary_negate
Predicate::argument_type
std::unary_function
これを言っても、私はそれstd::tr1::mem_fn
がを使用std::unary_function
も提供もしていないと思いargument_type
ます。
私が現在使用している解決策は、std :: tr1::bindの代わりにboost::bindを使用しているということです。
#include <boost/bind.hpp>
using namespace boost;
...
size_t countboost = count_if( foo_vector.begin(), foo_vector.end(), !( bind( &Foo::isEnabled, _1 )) );
複雑さ(および混乱)を避けるために、コード全体でstd :: tr1::bindの使用法をboost::bindに置き換えます。