Я пытаюсь использовать decltype в позднем указанном возврате функции-члена в базовом классе CRTP, и происходит ошибка: invalid use of incomplete type const struct AnyOp<main()::<lambda(int)> >
.
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, хотя и очень минимальные, на самом деле имеют значение в этом приложении.
Есть ли способ исправить то, что у меня есть или есть?Есть ли лучшее решение для решения этой проблемы?
Спасибо.