LINUX.ORG.RU

История изменений

Исправление 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]