Я хочу такую функцию:
template<typename C, typename T>
void foo(C &&aclass, T (C::*const memberFunc)(unsigned)) {
}
Параметры (словами, потому что синтаксис типа C/C++ является ментальным):
- Универсальная ссылка на класс, например.
MyClass
. - Константный указатель на функцию-член
MyClass
, которая принимает целое число без знака и возвращаетT
.
Этот вид работает, однако, если я вызываю его со ссылкой на l-значение в качестве первого параметра, я получаю сообщение об ошибке, например:
шаблон-кандидат игнорируется: выведены конфликтующие типы для параметра «C» («MyClass &» против «MyClass»)
Насколько я понимаю, он выводит C
из первого и второго параметров, но выводит разные выводы и путается.
В соответствии с этот ответ вы можете сделать вывод только по первому параметру и каким-то образом использовать ключевое слово typename
для второго параметра . Но я не могу разработать синтаксис для этого, когда я хочу, чтобы он выводил один из типов в параметре (T
), но не другой (C
).
Этот ответ также полезен, но они решают его, просто не используя ссылки для C
вообще, что в этом случае одинаково эффективен, но не в моем случае.
Это возможно?