Ответ 1
Следующий код работает для одного аргумента, но не для нескольких:
template<typename Obj, typename... Func>
void tmp_funct_2(Obj& obj, Func... func)
{
(obj .* ... .* func)();
}
int main()
{
foo obj;
auto to_foo = &foo::next;
tmp_funct_2(obj, to_foo);
}
Проблема в том, что выражение fold не расширяется до вложенного вызова указателей на функции...
(((((obj.*to_foo)().*to_foo)()).*to_foo)());
... но он скорее расширяется до чего-то вроде...
obj.*func0.*func1.*func2.*func3
... это не то, что вы хотите.
Если вы не перегрузите operator.*
, Я думаю, вы застряли с рекурсивным подходом здесь. В противном случае вы можете использовать некоторое временное хранилище и сбрасывать запятую:
template<typename Obj, typename... Func>
void tmp_funct_2(Obj& obj, Func... func)
{
auto* temp = &obj;
((temp = &((*temp).*func)()), ...);
}