Variadic template - method overloading

Variadic template - method overloading
TR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 3 lata
  • Postów:58
0

Hej,
mam dany kod:

Kopiuj
template<class ...T>
class OverloadedMethod;

template<class T>
class OverloadedMethod<T>
{
public:
    void f(T value)
    {
        cout << "OverloadedMethod(first): " << value << " : " << typeid(value).name() << endl;
    }
};

template<class T, class ...Ts>
class OverloadedMethod<T, Ts...> :
    public OverloadedMethod<Ts...>
{
public:
    void f(T value)
    {
        cout << "OverloadedMethod(second): " << value << " : " << typeid(value).name() << endl;
    }
};

Problem w tym, że dla większej liczby argumentów szablonu tylk pierwsza wariant funkcji f jest widoczny...
np.

Kopiuj
OverloadedMethod<int, double> overloadedMethod;
    overloadedMethod.f(double(1.0)); // będzie niejawne rzutowanie do inta... zamiast wywołać metodę (first).
    overloadedMethod.f(int(1));

Pomysł?

#edit
Mam 1 rozwiązanie - dopisanie

Kopiuj
using OverloadedMethod<Ts...>::f;

do klasy (second).

edytowany 1x, ostatnio: Trix
Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:minuta
  • Postów:1002
1

using OverloadedMethod<Ts...>::f;

Kopiuj
#include <iostream>

using std::cout;
using std::endl;

template<class ...T>
class OverloadedMethod;

template<class T>
class OverloadedMethod<T>
{
public:
    void f(T value)
    {
        cout << "OverloadedMethod(first): " << value << " : " << typeid(value).name() << endl;
    }
};

template<class T, class ...Ts>
class OverloadedMethod<T, Ts...> :
    public OverloadedMethod<Ts...>
{

public:
    using OverloadedMethod<Ts...>::f;

    void f(T value)
    {
        cout << "OverloadedMethod(second): " << value << " : " << typeid(value).name() << endl;
    }
};

int main() {
    OverloadedMethod<int, double> overloadedMethod;
    overloadedMethod.f(double(1.0));
    overloadedMethod.f(int(1));
}
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:minuta
1

Może lepiej opisz co chcesz uzyskać, bo mam wrażenie, że twoje rozwiązanie jest dalece przekombinowane.
Preferowana metoda opisu, to kod pokazujący, jak ma być używany ten szablon (we wszystkich możliwych warunkach brzegowych).

Inny sposób na poprawienie twojego kodu: https://godbolt.org/z/EKbYM4


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.