У вас есть две ошибки. Единственная ошибка - это то, что вы заметили сами. Другая ошибка заключается в том, что вы пытаетесь получить доступ к члену до его объявления. Объявите его перед использованием (обратите внимание, что возвращаемый тип, даже если он указан в конце, не может получить доступ к элементам, которые вы объявляете позже, в отличие от тела функции).
template <typename Func>
struct context_binder
{
private:
Func func;
public:
context_binder(const Func& func) :
func(func)
{ }
template <typename... TArgs>
auto operator ()(TArgs&&... args) const
-> decltype(this->func(std::forward<TArgs>(args)...))
{
return func(std::forward<TArgs>(args)...);
}
};
Так что 2)
, который вы называете недостатком своего обходного пути, на самом деле не является недостатком, потому что реальный способ его кодирования все еще требует объявления участника перед его использованием.