2

次のような Boost.Phoenix ラムダ式があるとします。

_1 * 4.5 + (3.0 / _2)

_1引数、などに関連付けられた型のリストを指定して、コンパイル時にラムダ式が有効かどうかを検出する良い方法はあります_2か? enable_if入力型がラムダでサポートされているかどうかを判断するために使用したいと考えています。もしそうなら、ラムダは直接呼び出されますが、そうでなければ、ノーオペレーションを生成したいと思います。擬似コードは次のようになります。

template <typename F, typename A1, typename A2>
enable_if<F::is_supported<A1, A2>, result_of<F(A1,A2)>::type >::type func(F func, A1 arg1, A2 arg2)
{
    func(A1, A2);
}

template <typename F, typename A1, typename A2>
disable_if<F::is_supported<A1, A2> >::type func(F func, A1 arg1, A2 arg2)
{
}

is_supportedどのように実装されるのか、それが可能かどうかさえわかりません。私は C++11 を使用していません。私は C++03 のみを想定しています (Phoenix が必要とするため)。

4

1 に答える 1

1

今日のフェニックスでは不可能だと思います。この使用をサポートするにenable_ifは、Phoenix が依存する他のライブラリであっても、すべてのレベルで、eval 呼び出しチェーンで Phoenix が行う実質的にすべての関数呼び出しで使用する必要がありました。Phoenix、Proto、およびそれらが依存するすべてのライブラリが純粋な C++11 で書き直される前に、Phoenix がそのように書かれていないことは知っています。それでも、すべての潜在的なエラーが SFINAE コンテンツに表示されるように細心の注意を払う必要があります。

私はそれが起こっているのを見ていません、ごめんなさい。

于 2013-02-15T17:53:42.237 に答える