[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.

[C++] Template Argument Deduction deduziert zu einfach

Beitragvon Schrompf » 05.06.2017, 23:02

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: Ansicht erweitern :: 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.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3537
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

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

Beitragvon B.G.Michi » 06.06.2017, 02:19

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

Code: Ansicht erweitern :: 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
B.G.Michi
 
Beiträge: 156
Registriert: 07.03.2006, 21:38
Alter Benutzername: B.G.Michi

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

Beitragvon Schrompf » 06.06.2017, 07:21

Ah, interesssant. Durch die Indirektion wird der zweite Parameter nicht zur Template Argument Deduction herangezogen. Danke!
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3537
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste