Указатель шаблона Variadic на объявление / использование функции-члена

// This compiles and runs properly
using MemPtr = Entity&(OBFactory::*)(const Vec2i&, float);
void test(MemPtr mptr, const Vec2i& p, float d)
{
(getFactory().*mptr)(p, d);
}

//  "no matching function for call to `test`,
//  failed candidate template argument deduction"template<typename... A> using MemPtr = Entity&(OBFactory::*)(A...);
template<typename... A> void test(MemPtr<A...> mptr, const Vec2i& p, float d)
{
(getFactory().*mptr)(p, d);
}

...

// I call both versions with
test(&OBFactory::func, Vec2i{0, 0}, 0.f);

Почему не работает вариабельная версия шаблона? Мне не хватает пересылки?

1

Решение

Я думаю, что это может служить примером того, что происходит в вашем коде:

struct A
{
// there are multiple overloads for func (or a template?)
void func(double) {}
void func(int) {}
};

//using MemPtr = void(A::*)(double);
//void test(MemPtr mptr, double d)
//{
//    (A().*mptr)(d);
//}

template<typename... As> using MemPtr = void(A::*)(As...);
template<typename... As> void test(MemPtr<As...> mptr, double d)
{
(A().*mptr)(d);
}

int main()
{
// test(&A::func, 0.); // line X
test(static_cast<void(A::*)(double)>(&A::func), 0.); // line Y
}

Проблема в строке X заключается в том, что вы используете &A::func и компилятор теперь должен вывести As... — что это не может. Строка Y исправляет это, явно приводя его к правильной перегрузке.

Если вы используете первую версию test (тот, что прокомментирован выше), testсигнатура уже содержит необходимый тип (вычитание не требуется), и компилятор знает, как приводить (в данном случае это означает, что Выбрать) правильная перегрузка для func,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]