Повышение MPL: вызывать функцию (член), только если она существует - PullRequest
5 голосов
/ 07 октября 2011

У меня есть класс A, у которого есть параметр шаблона T. Есть случаи использования, когда класс T предлагает функцию func1 (), и есть случаи использования, когда T не предлагает ее. Функция f () в A должна вызывать func1 (), если она существует. Я думаю, что это должно быть возможно с boost mpl, но я не знаю как. Вот некоторый псевдокод:

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

Еще лучше был бы другой случай:

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

1 Ответ

7 голосов
/ 07 октября 2011

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 проще написать эту черту в первую очередь, хотя это все еще несколько загадочно.

...