Sjabloonfuncties gebruiken in geneste boostbinding

Hoe kan ik deze functies sjablooneren?

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

Ik probeerde het volgende zonder succes:

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

Het zou leuk zijn als ik het zonder binder zou kunnen doen (). Dit is hoe ik van plan ben om ze te gebruiken:

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

Ik heb het volgende zonder geluk gecontroleerd:

how-to-use-manipulate-return-value-from- geneste-boostbind

uitvoeren-argument-substitutie-op-genest-boostbind-zonder-compositie

can-i-use-boost-bind-with-a- functie-template

1

1 antwoord

Je moet functie-aanwijzers goed spellen:

R(*func)(A1, A2)

U moet ook de sjabloonparameters opgeven voor het vormen van een functiepointer: Onthoud dat binder niet een functie is, maar een sjabloon !

&binder
&proxy

Ten slotte krijg je je signaalvariabele niet goed. Verklaar het als volgt:

boost::signals2::signal sig;

Gebruik dan:

sig.connect( /* all that stuff */ );
2
toegevoegd
@ user1005752: bijgewerkt.
toegevoegd de auteur Kerrek SB, de bron
@ user1005752: Nou, denk er een beetje over na ... wanneer je de functie pointer vormt, is er niets om uit te leiden, dus je moet de sjabloonparameters specificeren. Hoe kan de compiler anders ze kennen?
toegevoegd de auteur Kerrek SB, de bron
Ik heb de wijziging in de geposte code toegepast. Nog steeds niet gecompileerd.
toegevoegd de auteur user1005752, de bron
Dank je. Ik raak nog steeds een beetje in de war door het afleiden van sjabloonargumenten. Ik zal echter onthouden wat u hierboven al zei. Sorry voor het gedeelte signals2. Ik ben me bewust van dat deel, maar probeerde de code die ik heb gepost te "minimaliseren".
toegevoegd de auteur user1005752, de bron
Ik nam aan dat, aangezien de functie pointer in binding wordt ingevoerd, de sjabloontypen kunnen worden afgeleid door de resterende parameters die aan de binding worden doorgegeven. Ik denk dat ik me vergist heb. Bedankt voor het helpen verduidelijken van dingen!
toegevoegd de auteur user1005752, de bron