История изменений
Исправление Kuzy, (текущая версия) :
So, how to say «parameter pack» in Russian?
Без понятния.
А главное - как его получить без костылей?
Каких костылей? Это божественная сущность введенная в c++11, у нее нет типа, и получить ее можно только конструкцией с тремя точками.
Так а зачем? Конструктор меня полностью устраивает, меня параметры типа не устраивают, так сказать)
Ну так вывод шаблонных параметров только для функций работает. Поэтому нужно конструктор обернуть в функцию.
#include <functional>
#include <string>
class A {
public:
void foo(int arg1, int& arg2, std::string& str) {}
};
template <typename Ret, typename Class, typename... Args>
struct X {
Class* _this;
Ret (Class::*_f)(Args...);
std::function<Ret(Args&&...)> operator() () {
return [&] (Args&&... args) { (_this->*_f)(std::forward<Args>(args)...); };
}
};
template <typename Ret, typename Class, typename... Args>
auto make_X(Class* _this, Ret (Class::*_f)(Args...)) -> X<Ret, Class, Args...> {
return X<Ret, Class, Args...> {_this, _f};
}
int main() {
A a;
auto foo_functor_producer = make_X(&a, &A::foo);
auto ff = foo_functor_producer();
int t = 3;
std::string s = "s";
ff(3, t, s);
// ff(3, 3, s); // <- не компилируется, ссылки работают.
return 0;
}
Исправление Kuzy, :
So, how to say «parameter pack» in Russian?
Без понятния.
А главное - как его получить без костылей?
Каких костылей? Это божественная сущность введенная в c++11, у нее нет типа, и получить ее можно только конструкцией с тремя точками.
Так а зачем? Конструктор меня полностью устраивает, меня параметры типа не устраивают, так сказать)
Ну так вывод шаблонных параметров только для функций работает. Поэтому нужно конструктор обернуть в функцию.
#include <functional>
#include <string>
class A {
public:
void foo(int arg1, int& arg2, std::string& str) {}
};
template <typename Ret, typename Class, typename... Args>
struct X {
Class* _this;
Ret (Class::*_f)(Args...);
std::function<Ret(Args&&...)> operator() () {
return [&] (Args&&... args) { (_this->*_f)(std::forward<Args>(args)...); };
}
};
template <typename Ret, typename Class, typename... Args>
auto make_X(Class* _this, Ret (Class::*_f)(Args...)) {
return X<Ret, Class, Args...> {_this, _f};
}
int main() {
A a;
auto foo_functor_producer = make_X(&a, &A::foo);
auto ff = foo_functor_producer();
int t = 3;
std::string s = "s";
ff(3, t, s);
// ff(3, 3, s); // <- не компилируется, ссылки работают.
return 0;
}
Исходная версия Kuzy, :
So, how to say «parameter pack» in Russian?
Без понятния.
А главное - как его получить без костылей?
Каких костылей? Это божественная сущность введенная в c++11, у нее нет типа, и получить ее можно только конструкцией с тремя точками.
Так а зачем? Конструктор меня полностью устраивает, меня параметры типа не устраивают, так сказать)
Ну так вывод шаблонных параметров только для функций работает. Поэтому нужно конструктор обернуть в функцию.
#include <functional>
#include <string>
class A {
public:
void foo(int arg1, int& arg2, std::string& str) {}
};
template <typename Ret, typename Class, typename... Args>
struct X {
Class* _this;
Ret (Class::*_f)(Args...);
std::function<Ret(Args&&...)> operator() () {
return [&] (Args&&... args) { (_this->*_f)(std::forward<Args>(args)...); };
}
};
template <typename Ret, typename Class, typename... Args>
auto make_X(Class* _this, Ret (Class::*_f)(Args...)) {
return X<Ret, Class, Args...> {_this, _f};
}
int main() {
A a;
auto foo_functor_producer = make_X(&a, &A::foo);
auto ff = foo_functor_producer();
int t = 3;
std::string s = "s";
ff(3, t, s);
// ff(3, 3, s); // <- не компилируется, ссылки работают.
return 0;
}
[/cod]