Как мне написать прототипное преобразование, созданное по шаблону функцией?

Я хотел бы повторно использовать код, написав прото-преобразование, которое шаблонизируется указателем на функцию:

template <typename Ret, typename A0, typename A1, Ret func(A0,A1)>
struct apply_func : proto::callable
{
  // Do something with func
};

Однако сама функция является полиморфной, поэтому я не хочу указывать ее точное подпись.

Упрощенная версия того, что я хотел бы, чтобы мой код выглядел следующим образом (я использую внешние преобразования по технической причине, которая, как мне кажется, не связана с моим текущим вопросом - я не мог заставить рекурсию работать без них):

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

Это не компилируется из-за отсутствия аргументов в шаблоне appy_func. Есть ли решение?

6
задан Irit Katriel 4 March 2012 в 16:40
поделиться