25

関数の「バインダー」を変数に保存し、演算子のオーバーロード機能を利用して、次のコードで繰り返し使用したいと考えています。実際に私が望むことを行うコードは次のとおりです。

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

class X 
{       
    int n; 
public: 
    X(int i):n(i){}
    int GetN(){return n;}  
};

int main()
{
    using namespace std;
    using namespace boost;

    X arr[] = {X(13),X(-13),X(42),X(13),X(-42)};
    vector<X> vec(arr,arr+sizeof(arr)/sizeof(X));

    _bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);

    cout << "With  n =13 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 13)
         << "\nWith |n|=13 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 13 || bindGetN == -13)
         << "\nWith |n|=42 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 42 || bindGetN == -42) 
         << "\n";

    return 0;                                                                    
} 

もちろん、気になるのは次の行です。

bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);

意図的に型エラーを作成し、エラー メッセージを分析するだけで型を取得できました。それは確かに良い方法ではありません。「bindGetN」の型を取得する方法はありますか? または、同様の機能を生成する別の方法があるのでしょうか?

編集:言うのを忘れていましたがfunction、この場合、使用する「標準」の提案は機能しません。これは、オペレーターをオーバーロードさせたいためです。

4

1 に答える 1

17

簡単に言えば、知る必要はありません (実装が定義されています)。これはバインド式です (std::tr1::is_bind_expression<T>::value実際の型に対して true を生成します)。

見る

  1. std::tr1::function<>
  2. BOOST_AUTO()
  3. c++0x 'auto'キーワード (型推論)
    • それdecltype()はあなたがさらに前進するのを助けることができます

1.

std::tr1::function<int> f; // can be assigned from a function pointer, a bind_expression, a function object etc

int realfunc();
int realfunc2(int a);

f = &realfunc;
int dummy;
f = tr1::bind(&realfunc2, dummy);

2.

BOOST_AUTO() は、コンパイラの c++0x サポートなしで c++0x auto のセマンティクスをサポートすることを目的としています。

BOOST_AUTO(f,boost::bind(&T::some_complicated_method, _3, _2, "woah", _2));

3.

基本的に同じですが、コンパイラのサポートがあります:

template <class T> struct DoWork { /* ... */ };

auto f = boost::bind(&T::some_complicated_method, _3, _2, "woah", _2));

DoWork<decltype(T)> work_on_it(f); // of course, using a factory would be _fine_

auto はおそらくこの種の状況のた​​めに発明されたものであることに注意してください。実際の型は「知りたくない」ものであり、コンパイラ/プラットフォーム/ライブラリ間で異なる場合があります

于 2011-06-20T13:47:34.500 に答える