Vorrei riutilizzare il codice scrivendo un proto trasformare che è templato da un puntatore a funzione:Come si scrive una proto trasformazione basata su una funzione?
template <typename Ret, typename A0, typename A1, Ret func(A0,A1)>
struct apply_func : proto::callable
{
// Do something with func
};
Tuttavia, la funzione stessa è polimorfa quindi non voglio specificare la sua firma esatto.
Segue una versione semplificata di quello che vorrei che il mio codice assomiglia (sto usando trasformazioni esterne per un motivo tecnico che ritengo non correlato alla mia domanda corrente: non ho potuto far funzionare la ricorsione senza di loro):
template<typename R, typename A0, typename A1>
R plus_func(A0 lhs, A1 rhs) { return lhs+rhs; }
template<typename R, typename A0, typename A1>
R minus_func(A0 lhs, A1 rhs) { return lhs-rhs; }
struct my_grammar;
struct plus_rule : proto::plus<my_grammar, my_grammar> {};
struct minus_rule : proto::minus<my_grammar, my_grammar> {};
struct my_grammar
: proto::or_<
proto::when<proto::terminal<proto::_>, proto::_value>
, proto::when<plus_rule, proto::external_transform >
, proto::when<minus_rule, proto::external_transform >
>
{};
struct my_external_transforms
: proto::external_transforms<
proto::when<plus_rule, apply_func<plus_func>(my_grammar(proto::_left),my_grammar(proto::_right), proto::_state)>
, proto::when<minus_rule, apply_func<minus_func>(my_grammar(proto::_left),my_grammar(proto::_right), proto::_state)>
>
{};
Questo non viene compilato perché mancano argomenti al modello appy_func. C'è una soluzione?
Speravo di trovare una soluzione che consentisse all'utente di specificare più_func e meno_func in modo più conciso (non mi dispiace complicare le altre parti). Capisco dal tuo primo punto che questo non è possibile - Non posso prendere una funzione libera basata su modelli e trasformarla in un funtore polimorfico. Destra? –
Oh, vedo la mia confusione. Grazie per l'aiuto. –
Nota che con C++ 11, il plus_func potrebbe essere piuttosto facile da scrivere usando auto/decltype e non richiede la struttura di supporto risultato <>. Ora, l'oggetto funzione polimorfico è un'astrazione piuttosto ordinata che aiuta a incapsulare il modello come il functor in una struttura non di template. In C++ 03 questo è praticamente lo scatto migliore che hai e Proto è fatto per riconoscerli immediatamente. –