Mam następujący typ cechę:Jak mogę znaleźć liczbę argumentów funkcji szablonu?
template <class T>
struct Arity : Arity<decltype(&T::operator())> {};
template <class T, class R, class... Args>
struct Arity<R(T::*)(Args...)> {
static constexpr auto value = sizeof...(Args);
};
template <class T, class R, class... Args>
struct Arity<R(T::*)(Args...) const> {
static constexpr auto value = sizeof...(Args);
};
template <class R, class... Args>
struct Arity<R(*)(Args...)> {
static constexpr auto value = sizeof...(Args);
};
który działa wspaniale jest znaleźć liczbę argumentów funkcji potrzebny większości przypadków użycia, ale to nie dla jednej wspólnej sprawy:
auto l1 = [](int, double){};
Arity<decltype(l1)>::value; // works, 2
auto l2 = [](auto, auto){};
Arity<decltype(l2)>::value; // error: Reference to overloaded function could not be resolved; did you mean to call it?
wierzę nie da się na ogół wykonać tej pracy dla dowolnej funkcji/operatora(), ponieważ w zależności od typów/wartości przekazywanych jako typy szablonów, można wybrać inne przeciążenie, lub może w ogóle nie być dostępne przeciążenie. Ponadto, nie ma sposobu, aby wiedzieć, jakie poprawne typy i wartości przekazać jako argumenty szablonu. Ale nadal, chcę, żeby to działało dla wspólnego przypadku argumentów lambda pobierających auto
. Czy jest jakiś sposób, aby uczynić to bardziej niezawodnym i obejmować lambdy, które biorą auto argumenty?
Czy awaria kompilacja widać ciężko awaria lub SFINAE powodując żadnych kwalifikowanych kandydatów? Myślę, że istnieje sposób na policzenie argumentów funkcji, ale nie jestem pewien, czy ładnie wybrałby między bieżącą a wersją z obsługą szablonu lambda. –
@BenVoigt 'Odniesienie do przeciążonej funkcji nie mogło zostać rozwiązane; czy chciałeś to nazwać? ' – David
Dobrze, więc masz poważny błąd. To sprawia, że trochę bardziej bolesne jest tworzenie rozwiązania, które działa zarówno z argumentami typu "i bez szablonu" na 'operator()'. –