5

テンプレート パラメーター T を持つクラス A があります。クラス T が関数 func1() を提供するユース ケースと、T が提供しないユース ケースがあります。A の関数 f() は、存在する場合、func1() を呼び出す必要があります。これはブースト mpl で可能だと思いますが、方法がわかりません。ここにいくつかの擬似コードがあります:

template<class T>
class A
{
    void f(T param)
    {
        if(T::func1 is an existing function)
            param.func1();
    }
};

さらに良いのは、else-case です。

template<class T>
class A
{
    void f(T param)
    {
        if(T::func1 is an existing function)
            param.func1();
        else
            cout << "func1 doesn't exist" << endl;
    }
};
4

1 に答える 1

7

Boost.MPL は厳密に TMP 用であり、TMP でメンバーを呼び出すことができないため、これを処理しません。Boost.Fusion と Boost.TypeTraits にも何もありません。どちらかだと思っていたのですが、どうやら記憶違いのようです。

ここここでは、C++03 でメンバーを検出するためのトレイトを作成する方法について、いくつかの解決策を示します。そのような特性 (私はそれを と呼びますhas_func1_member) を取得したら、それを SFINAE に使用できます。

template<typename T>
typename boost::enable_if<has_func1_member<T> >::type
maybe_call(T& t)
{ t.func1(); }

template<typename T>
typename boost::disable_if<has_func1_member<T> >::type
maybe_call(T&)
{
    // handle missing member case
}

// your example code would then do:
maybe_call(param);

C++11 では、最初からトレイトを記述する方が簡単であることに注意してください。

于 2011-10-07T12:23:44.210 に答える