Variadic template - method overloading

Variadic template - method overloading
TR
  • Rejestracja: dni
  • Ostatnio: dni
  • 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).

Spearhead
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1007
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
  • Rejestracja: dni
  • Ostatnio: dni
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

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.