ネストされたブーストバインドでのテンプレート関数の使用

これらの機能をどのようにテンプレート化できますか?

boost::function< void(int) > binder( void(*func)(int, char), int a1, char a2 )
{
    return boost::bind( func, a1, a2 );
}

void proxy( boost::function< void(int) > func, int a1 )
{
    boost::bind( func, a1 )();
}

私は成功なしで次のことを試みた:

template< typename R, typename A1, typename A2 >
static boost::function< void(int) > binder( R(*func)(A1,A2), A1 a1, A2 a2 )
{
    return boost::bind( func, a1, a2 );
}

template< typename A1 >
static void proxy( boost::function< void(A1) > func, A1 a1 )
{
    boost::bind( func, a1 )();
}

私がバインダーなしでできることはいいですね()。これが私の使い方です:

void print( int i, char c );
boost::signals2::signal.connect(
    boost::bind(
        &proxy,
        boost::bind(
            &binder,
            &print,
            _1,
            'a'
            ),
        _1
        )
    );

私は運がないと次のチェックアウト:

使用方法操作戻り値from-from-ネストブーストバインド

実行 - 引数 - 置換 - 入れ子 - ブーストバインド - コンポジションなし

can-i-use-boost-bind-with-a-機能テンプレート

1
追加された 編集された
ビュー: 1

1 答え

あなたは関数ポインタを正しくスペルする必要があります:

R(*func)(A1, A2)

関数ポインタを作成するためのテンプレートパラメータも指定する必要があります: binder は関数ではなくテンプレートです。

&binder
&proxy

最後に、あなたはシグナルを正しく得ることができません。これを次のように宣言します:

boost::signals2::signal sig;

それから、

sig.connect( /* all that stuff */ );
2
追加された
@ user1005752:更新されました。
追加された 著者 Kerrek SB,
@ user1005752:それはちょっと考えてみてください。関数ポインタを作成しているときに推論するものはないので、テンプレートパラメータを指定する必要があります。どのようにコンパイラがそれらを知ることができましたか?
追加された 著者 Kerrek SB,
投稿コードに変更を適用しました。まだコンパイルされませんでした。
追加された 著者 user1005752,
ありがとうございました。私はまだテンプレートの引数が推測されるときに少し混乱します。私はあなたが上記のことを心に留めておきます。信号2については申し訳ありません。私はその部分を認識していますが、私が投稿したコードを「最小化」しようとしていました。
追加された 著者 user1005752,
私は、関数ポインタがバインドに渡されたので、バインドに渡された残りのパラメータによってテンプレート型が導き出されると仮定していました。私は間違っていたと思う。明確なことを助けてくれてありがとう!
追加された 著者 user1005752,