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

Iho*_*r R 17 c++ pointer-to-member fold-expression c++17

这段代码多次调用&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...);
}
Run Code Online (Sandbox Code Playgroud)

现在我想用一个折叠表达式替换递归调用

例:

template<typename Obj, typename... Func>
void tmp_funct_2(Obj& obj, Func... func)
{
    (obj .* ... .* func());
}
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为指向成员调用的指针的正确语法是

(obj.*func)()
Run Code Online (Sandbox Code Playgroud)

如何使用模板折叠表达式获得相同的结果?谢谢!

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);
}
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 15

以下代码适用于单个参数,但不适用于多个参数:

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);
}
Run Code Online (Sandbox Code Playgroud)

问题是fold表达式没有扩展到函数指针的嵌套调用,如...

(((((obj.*to_foo)().*to_foo)()).*to_foo)());
Run Code Online (Sandbox Code Playgroud)

......但它扩展到类似......

obj.*func0.*func1.*func2.*func3
Run Code Online (Sandbox Code Playgroud)

......这不是你想要的.


除非你超载operator.*,否则我认为你在这里坚持使用递归方法.否则,您可以使用一些临时存储并折叠逗号运算符:

template<typename Obj, typename... Func>
void tmp_funct_2(Obj& obj, Func... func)
{
    auto* temp = &obj;
    ((temp = &((*temp).*func)()), ...);
}
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例

  • 这个工作折叠表达式达到了只写代码的perl级别......但仍然是一个很好的答案 (9认同)