Пересылка аргументов в функцию-член шаблона
Мне нужно переслать некоторые предопределенные аргументы плюс некоторые переданные пользователем аргументы функции-члену.
#define FWD(xs) ::std::forward<decltype(xs)>(xs)
template<class T, class... Ts, class... TArgs>
void forwarder(void(T::*fptr)(Ts...), TArgs&&... xs)
{
T instance;
(instance.*fptr)(FWD(xs)..., 0);
// ^
// example predefined argument
}
forwarder(&example::f0, 10, 'a');
forwarder(&example::f1, 10, "hello", 5);
Это работает правильно для не-шаблонных функций-членов.
Указатель на функцию-член переданforwarder
может, однако, указывать на функции шаблона. К сожалению, компилятор не может определить типT
в таком случае:
struct example
{
void f0(int, int) { }
template<class T>
void f1(T&&, int) { }
};
// Compiles
forwarder(&example::f0, 10);
// Does not compile
forwarder(&example::f1, 10);
Ошибки:
prog.cpp:30:28: error: no matching function for call to 'forwarder(<unresolved overloaded function type>, int)'
forwarder(&example::f1, 10);
^
prog.cpp:20:6: note: candidate: template<class T, class ... Ts, class ... TArgs> void forwarder(void (T::*)(Ts ...), TArgs&& ...)
void forwarder(void(T::*fptr)(Ts...), TArgs&&... xs)
^
prog.cpp:20:6: note: template argument deduction/substitution failed:
prog.cpp:30:28: note: couldn't deduce template parameter 'T'
forwarder(&example::f1, 10);
Могу ли я помочь компилятору определить правильные типы?без изменения интерфейсаforwarder
?
Если нет, как лучше решить эту проблему, не делая синтаксис пользователя слишком сложным?
РЕДАКТИРОВАТЬ: Также было бы приемлемо передать указатель на функцию-член в качестве параметра шаблона, возможно, через оболочку. Целевая функция-член всегда будет известна во время компиляции. псевдокод:
forwarder<WRAP<example::f0>>(10, 'a');
// Where WRAP can be a macro or a type alias.