LINUX.ORG.RU

Вывести типы аргументов функтора

 ,


1

2

Приветствую.

#include <functional>
using namespace std;

template <typename T>
struct FTraits;

template <typename R, typename A>
struct FTraits<function<R(A)>> {
	using Ret = R;
	using Arg = A;
};

struct S {
	//S(S&&) = delete;
	//S() = default;
	// ^^^^ needs to be uncommented ^^^^
};

template <typename T>
void fn(T t) {
	using U = typename FTraits<decltype(function(declval<T>()))>::Arg;
	//static_assert(U ...);
}
int main() {
	fn([](S){});
}

Словами - в fn передаём некий функтор, узнаём тип его аргумента и проверяем соответсвие этого типа каким-то критериям валидности. Всё работает до тех пор, пока тип умеет стандартно копироваться/создаваться (этого хочет std::function).

В данном случае хочу проверить в статик_ассерте, что сигнатура функтора принимает аргумент по ссылке, а не по значению. В принципе, компиляция упадёт и так где-нибудь в недрах в последнем случае, но со своей проверкой вывод будет значительно менее портянообразным, юзеру будет приятней.

Какие-нибудь варианты? Как-то обойтись без std::function и применить какую-нибудь «магию» напрямую к функтору?

★★

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.