gpt4 book ai didi

c++ - 指向折叠表达式中的成员函数的指针

转载 作者:IT老高 更新时间:2023-10-28 22:14:11 25 4
gpt4 key购买 nike

这段代码多次调用 &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)()), ...);
}

live example on wandbox.org

关于c++ - 指向折叠表达式中的成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50912540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com