c++ - Überladungsauflösung für geerbte Funktionen



templates inheritance (1)

Es ist einfach, wenn Sie es erkennen: Ihr Operator ist nicht const qualifiziert, während der des Lambdas einer ist (es sei denn, Sie definieren das Lambda als mutable ). Daher passt es besser zu Ihrer nicht konstanten Instanz von Poc .

Fügen Sie einfach die fehlende const :

auto operator() (Ts...) const

Ich möchte eine Struktur haben, die eine beliebige Anzahl von Lambdas akzeptiert und als zentrale Anlaufstelle für alle ihre Anrufbetreiber dient.

Wenn der Aufrufer mit einer Argumentliste aufgerufen wird, die keinem der bei der Konstruktion angegebenen Lambda entspricht, sollte ein Standard-Aufrufer aufgerufen werden.

Ich dachte, der folgende Code würde genau das erreichen. Der Call Operator für jedes Lambda wird über using in die Poc Klasse "gehoben".

template <typename ...Lambdas>
struct Poc : Lambdas...
{
    using Lambdas::operator() ...; // Lift the lambda operators into the class

    template <typename ...Ts>
    auto operator() (Ts...)
    {
        std::cout << "general call" << std::endl;
    }
};

// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;

int main()
{
    auto l_int = [](int) {std::cout << "int" << std::endl; };

    Poc poc{l_int};
    poc(1);//calls the default operator. why?

    return 0;
}

Wenn ich nicht den Standard-Aufrufoperator in der Struktur habe, funktioniert alles wie erwartet (mit gültigen Argumentlisten). Wenn ich es der Struktur hinzufüge (wie im obigen Code), wird der Standardoperator jedes Mal aufgerufen, unabhängig davon, mit welchen Argumenten ich es aufrufe.

Meines Erachtens sind die Lambda-Call-Operatoren und die Structs-Call-Operatoren (Standard) im gleichen Umfang vorhanden. Daher sollten sie alle auf die Überlastungsauflösung untersucht werden. Da der lamdba-Operator spezifischer ist als der generische Standardoperator, sollte er ausgewählt werden.

Anscheinend ist das nicht der Fall. Warum das?

Ich habe auf Microsoft Visual C ++ , Clang und GCC getestet (alle in den neuesten Versionen).

Bearbeiten:





overloading