[C++] Template Argument Deduction deduziert zu einfach

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

[C++] Template Argument Deduction deduziert zu einfach

Beitrag von Schrompf »

Moin Leute,

ich habe auf Arbeit ein Template-Problem und hoffe, ihr könnt mir sagen, ob es dafür vielleicht eine klassische Lösung gibt. Folgender minimaler Beispielcode:

Code: Alles auswählen

struct Test {
   virtual void Foo(const int& i) = 0;
};

template <typename ArgumentType>
void CallDatShiat(void (Test::*method)(ArgumentType), ArgumentType p) {
   ... do something
}

void SomewhereElse(const int& k)
{
   CallDatShiat(&Test::Foo, k);
}
Was es tun soll: Erkennen, dass der ArgumentType ein const int& ist, und den Parameter an den Aufruf weiterleiten.
Was stattdessen passiert: der Compiler ermittelt conflicting types für den ArgumentType, nämlich im Member Function Pointer (völlig korrekt) als const int&, aber im Parameter p nur ohne alle Qualifizierer als int.

Wie kann ich das lösen, so dass ich der Funktion jeweils einen Member Function Pointer geben kann und der Compiler dann genau die Parameter auch in der weiteren Parameterliste nimmt? Gibt's da irgendne klassische Lösung?

Danke im Voraus.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: [C++] Template Argument Deduction deduziert zu einfach

Beitrag von B.G.Michi »

Einen non-deduced context verwenden (http://en.cppreference.com/w/cpp/langua ... _deduction):

Code: Alles auswählen

struct Test
{
    virtual void Foo(const int& i) = 0;
};

template<class T>
class identity
{
public:
    typedef T type;
};

template <typename ArgumentType>
void CallDatShiat(void (Test::*method)(ArgumentType), typename identity<ArgumentType>::type p) {
    printf("hello world");
}

void SomewhereElse(const int& k)
{
    CallDatShiat(&Test::Foo, k);
}
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Template Argument Deduction deduziert zu einfach

Beitrag von Schrompf »

Ah, interesssant. Durch die Indirektion wird der zweite Parameter nicht zur Template Argument Deduction herangezogen. Danke!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten