Использование decltype в позднем указанном возврате в базовом классе CRTP

Я пытаюсь использовать decltype в конце указанного возврат функции-члена в базовом классе CRTP и ошибка: недопустимое использование неполного типа const struct AnyOp

> .

template<class Op>
struct Operation
{
    template<class Foo>
    auto operator()(const Foo &foo) const ->
        typename std::enable_if<is_foo<Foo>::value,
                                decltype(static_cast<const Op*>(nullptr)->call_with_foo(foo))>::type     
    {
        return static_cast<const Op*>(this)->call_with_foo(foo);
    }
};


template<class Functor>
struct AnyOp : Operation<AnyOp<Functor> >
{
    explicit AnyOp(Functor func) : func_(func) {}

    template<class Foo>
    bool call_with_foo(const Foo &foo) const
    {
        //do whatever
    }

  private:
    Functor func_;
};

Я в основном пытаюсь переместить всю пластину-котел sfinae в базовый класс, поэтому мне не нужно повторять это для каждой операции, которую я создаю (в настоящее время каждая операция имеет 6 разных вызовов, и существует ~ 50 операций, поэтому с enable_if довольно много повторений).

Я пробовал решение, основанное на перегрузке, но один из передаваемых типов - это все, что вызывается (это может быть обычный функтор из C ++ 03 или лямбда C ++ 0x), с которым я связался. std :: function, к сожалению, накладные расходы от std :: function, хотя и очень минимальны, на самом деле имеют значение в этом приложении.

Есть ли способ исправить то, что у меня есть сейчас, или есть лучшее решение для решения этой проблемы?

Спасибо.

6
задан Johannes Schaub - litb 2 October 2011 в 10:44
поделиться