Variadic template - method overloading

0

Hej,
mam dany kod:

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.

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

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

do klasy (second).

1

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

#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));
}
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1