Ujednoznacznienie przeciążonego wskaźnika funkcji elementu przekazywanego jako parametr szablonu

Próbuję odtworzyćWzór obserwatora gdzie mogę perfekcyjnie przekazywać parametry danej funkcji obserwatorów.

Jeśli spróbuję przekazać adres afunkcja członkowska który mawiele nadpisań, nie może wywnioskować poprawnej funkcji członka na podstawie argumentów.

#include <iostream>
#include <vector>
#include <algorithm>

template<typename Class>
struct observer_list
{
    template<typename Ret, typename... Args, typename... UArgs>
    void call(Ret (Class::*func)(Args...), UArgs&&... args)
    {
        for (auto obj : _observers)
        {
            (obj->*func)(std::forward<UArgs>(args)...);
        }
    }
    std::vector<Class*> _observers;
};

struct foo
{
    void func(const std::string& s)
    {
        std::cout << this << ": " << s << std::endl;
    }
    void func(const double d)
    {
        std::cout << this << ": " << d << std::endl;
    }
};

int main()
{
    observer_list<foo> l;
    foo f1, f2;
    l._observers = { &f1, &f2 };

    l.call(&foo::func, "hello");
    l.call(&foo::func, 0.5);

    return 0;
}

To się nie udaje skompilowaćtemplate argument deduction/substitution failed.

Zauważ, że miałemArgs... iUArgs... ponieważ muszę być w stanie przekazać parametry, które niekoniecznie są tego samego typu, co typ podpisu funkcji, ale są wymienialne na ten typ.

Myślałem, że mogę użyćstd::enable_if<std::is_convertible<Args, UArgs>> wezwanie do ujednoznacznienia, ale nie wierzę, że mogę to zrobić za pomocą pakietu parametrów szablonu zmiennego?

Jak mogę uzyskać odliczenie argumentu szablonu, aby tutaj działać?

questionAnswers(1)

yourAnswerToTheQuestion