c – 指向折叠表达式中成员函数的指针
作者:互联网
这段代码多次调用& foo :: next
struct foo
{
foo& next()
{
return *this;
}
};
template<typename Obj>
void tmp_funct_1(Obj& obj)
{}
template<typename Obj, typename Func, typename... Other>
void tmp_funct_1(Obj& obj, Func func, Other... other)
{
tmp_funct_1((obj.*func)(), other...);
}
现在我想用一个折叠表达式替换递归调用
例:
template<typename Obj, typename... Func>
void tmp_funct_2(Obj& obj, Func... func)
{
(obj .* ... .* func());
}
它不会编译,因为指向成员调用的指针的正确语法是
(obj.*func)()
如何使用模板折叠表达式获得相同的结果?
谢谢!
int main()
{
foo obj;
auto to_foo = &foo::next;
tmp_funct_1(obj, to_foo, to_foo, to_foo);
// tmp_funct_2(obj, to_foo, to_foo, to_foo);
}
解决方法:
以下代码适用于单个参数,但不适用于多个参数:
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)()), ...);
}
标签:pointer-to-member,fold-expression,c,c17 来源: https://codeday.me/bug/20190910/1800662.html