Seite 1 von 1

[C++] Template Argument Deduction deduziert zu einfach

Verfasst: 05.06.2017, 23:02
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.

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

Verfasst: 06.06.2017, 02:19
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);
}

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

Verfasst: 06.06.2017, 07:21
von Schrompf
Ah, interesssant. Durch die Indirektion wird der zweite Parameter nicht zur Template Argument Deduction herangezogen. Danke!