Usando funções de modelo no bind de aumento aninhado

Como posso modelar essas funções?

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 )();
}

Eu tentei o seguinte sem sucesso:

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 )();
}

Seria bom se eu pudesse fazer sem fichário (). É assim que pretendo usá-los:

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

Eu verifiquei o seguinte sem sorte:

como-usar-manipular-retornar-valor-de- nested-boostbind

executar-argumento-substituição-em-aninhado-boostbind-sem-composição

can-i-use-boost-bind-with-a- template de função

1

1 Respostas

Você precisa soletrar corretamente os ponteiros de função:

R(*func)(A1, A2)

Você também precisará especificar os parâmetros do modelo para formar um ponteiro de função: Lembre-se de que fichário não é uma função, mas um modelo !

&binder
&proxy

Finalmente, você não está acertando sua variável de sinal. Declare assim:

boost::signals2::signal sig;

Então use:

sig.connect( /* all that stuff */ );
2
adicionado
@ user1005752: Atualizado.
adicionado o autor Kerrek SB, fonte
@ user1005752: Bem, pense um pouco ... quando você está formando o ponteiro de função, não há nada para deduzir, então você deve especificar os parâmetros do modelo. De que outra forma o compilador poderia conhecê-los?
adicionado o autor Kerrek SB, fonte
Eu apliquei a mudança no código postado. Ainda não compilou.
adicionado o autor user1005752, fonte
Obrigado. Eu ainda fico um pouco confuso quando os argumentos modelo são deduzidos. Vou ter em mente o que você mencionou acima embora. Desculpe pela parte dos signals2. Estou ciente dessa parte, mas estava tentando "minimizar" o código que postei.
adicionado o autor user1005752, fonte
Eu estava assumindo desde que o ponteiro de função é passado para a ligação, que os tipos de modelo poderiam ser deduzidos pelos parâmetros restantes passados ​​para a ligação. Eu acho que estava enganado. Obrigado por ajudar a esclarecer as coisas!
adicionado o autor user1005752, fonte