関数ポインターによってテンプレート化されたプロト変換を作成して、コードを再利用したいと思います。
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 テンプレートへの引数が欠落しているため、これはコンパイルされません。解決策はありますか?