Опитвам се да внедря функцията за свързване от библиотеката за повишаване. По-долу можете да видите основната структура bind_t
с дефинирана operator()
.
Въпросът ми е следният: Защо трябва да посочим в decltype в връщащ тип на operator()
връщащ тип на call()
изрично като членска функция (ако премахна this->
преди call
, дедукцията на аргумента на шаблона е неуспешна в g++.)
Също така е интересно, че при използване на clang++ няма такъв проблем.
Нямам идея защо се случва това.
template <typename F, typename ... P>
struct bind_t {
private:
std::tuple<typename holder<P>::type...> p;
F func;
template <size_t ... N, typename ... Args>
auto call(index_list<N ...>, Args const& ... args) const -> decltype(func(std::get<N>(p)(args...)...)) {
return func(std::get<N>(p)(args...)...);
}
public:
bind_t(F f, P ... p):
p(std::move(p)...),
func(std::move(f))
{}
template <typename ... Args>
auto operator()(Args const& ... args) const -> decltype(this->call(typename indices_by_num<sizeof...(P)>::type(), args...)) {
typename indices_by_num<sizeof...(P)>::type indices;
return call(indices, args...);
}
};
пълен източник на внедряване
обикновен случай на използване