Приветствую.
#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 и применить какую-нибудь «магию» напрямую к функтору?