Я пытаюсь использовать 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, хотя и очень минимальны, на самом деле имеют значение в этом приложении.
Есть ли способ исправить то, что у меня есть сейчас, или есть лучшее решение для решения этой проблемы?
Спасибо.