2009-08-26 16 views
5

これまでは、STLコンテナに対して直接操作を行うためにbind1st関数とbind2nd関数を使用しました。STLを使用して複数の関数引数をバインドする

 
class X 
{ 
public: 
    std::string getName() const; 
}; 

私はfor_eachを使用して、次の静的関数を呼び出すようにしたい、そのように第一及び第二のパラメータの両方を結合:

StaticFuncClass私は今simplicitiesのために以下の通りですMyBaseクラスのポインタのコンテナを持っています:: doSomething(ptr-> getName()、funcReturningString());

for_eachを使用して、この関数の両方のパラメータをバインドするにはどうすればよいですか?

私はの線に沿って何かを探しています:

 
for_each(ctr.begin(), ctr.end(), 
     bind2Args(StaticFuncClass::doSomething(), 
        mem_fun(&X::getName), 
        funcReturningString()); 

私はブーストがここで使用であろう何かのように見える、独自のバインド機能を提供していますが、STLのソリューションは何である参照してください?

ご回答いただきありがとうございます。

+0

だけ明確にすること、各要素 'e'のためにシーケンス、あなたは 'StaticFuncClass :: doSomething(e.getName()、funcReturningString())'を呼び出すには? – jalf

+0

はい...技術的には、コンテナ内の要素がポインタなので、e-> getName()となります。 –

答えて

13

バインド構文はあまりにも奇妙な取得信頼性のフォールバックは、独自のファンクタを定義することです:

struct callDoSomething { 
    void operator()(const X* x){ 
    StaticFuncClass::doSomething(x->getName(), funcReturningString()); 
    } 
}; 

for_each(ctr.begin(), ctr.end(), callDoSomething()); 

これは、多かれ少なかれbind機能はとにかく裏で何をすべきか。

あなたは(Jalfがあったとして)コンパイラによってインライン化できるローカルファンクタ構造を作成したり、簡単な関数を使用することができますいずれか
+0

+1はい、私もそれについて考えていました。 bind1stやbind2ndを使って2つのうちの1つだけをバインドするようなインラインの方法があるかどうかは疑問でした。 –

+0

しかし、コンストラクタの必要はありません。 – xtofl

+1

STLのバインド機能では可能かもしれませんが、私にとってはあまりにも毛深くなります。ファンクタのアプローチが好きです。もちろんC++ 0xではラムダでインラインで定義することができます – jalf

4

"STLソリューション"は、独自のバインダを作成することです...そのため、強力なboost :: bindを作成しました。

+2

powerfool? :p – jalf

+0

eh eh :) fixed! – UncleZeiv

3

void myFunc(const X* x) { 
    StaticFuncClass::doSomething(x->getName(), funcrReturningString()); 
} 

for_each(c.begin(), c.end(), myFunc); 
+1

&は必要ではありません。関数は暗黙的に関数ポインタに変換できるので、 'myFunc'だけがafaikで動作します。 – jalf

+0

あなたは正しいです。それは必要ではありません。悪い習慣、私は恐れている。 – xtofl

関連する問題