W niektórych sytuacjach pożądane jest, aby można było wpisać-wymazać wywoływalny (np. Funkcja, wskaźnik funkcji, instancja obiektu z operator()
, lambda, mem_fn
), na przykład w Using Boost adaptors with C++11 lambdas, gdzie wymagany jest typ możliwy do przypisania i domyślny.Wywołanie sygnatury wywołania lambda lub arbitralnie wywoływanej dla "make_funkcji"
std::function
byłby idealny, ale wydaje się, że nie da się automatycznie ustalić, co podpis do instancji klasy szablon std::function
z. Czy istnieje prosty sposób na uzyskanie sygnatury funkcji dowolnego wywołania i/lub zawinięcie jej w odpowiedniej instancji instancji std::function
(tj. Szablonu funkcji make_function
)?
Konkretnie szukam jednej lub drugiej
template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }
takie, że make_function([](int i) { return 0; })
Zwraca std::function<int(int)>
. Oczywiście nie oczekuje się, że zadziała, jeśli wystąpienie będzie można wywołać z więcej niż jednym sygnaturą (np. Obiekty z więcej niż jednym szablonem lub domyślnym parametrem operator()
s).
Zwiększenie jest w porządku, chociaż preferowane są rozwiązania nieobciążające, które nie są nadmiernie skomplikowane.
Edytuj: odpowiadając na własne pytanie.
Jeśli tylko dbać o lambdas wtedy tak, można zmusić go do pracy. Odradzam to - podejrzewam, że introspekcyjne funktory są w pewien sposób antyplemne w C++ 11. Upewnij się również, że naprawdę potrzebujesz 'std :: function'. –