C++17-可变参数模板参数-使用模板参数调用前一个返回值的类方法

我有这个代码:

struct Foo{
    int sum;

    Foo() : sum(0) {}
    Foo(int x) : sum(x) {}

    Foo bar(int x){
        return Foo(sum + 1);
    }

    Foo bar(std::vector<int> x){
        return Foo(sum + 1);
    }

    Foo bar(const char* str){
        return Foo(sum + 1);
    }
};


template <typename ... T>
int foo(T ... args){            
    Foo foo;

    //(foo.bar(args), ...);
    return foo.sum;
}

int main() {
   foo(1, 2, "hello", std::vector<int>());
   return 0;
}

我想像这样创建调用层次结构:

Foo foo;
foo = foo.bar(1);
foo = foo.bar(2);
foo = foo.bar("hello");

基于可变参数模板参数args

我正在查看折叠表达式,但这似乎无法满足我的需要。我可以折叠要单独调用的方法,但不能根据上一个的结果调用下一个。

有什么办法可以做到这一点吗?

回答

您可以为此使用折叠表达式。

((foo = foo.bar(args)), ...);

我们需要额外()的赋值来让编译器接受语法。我假设这就是你想要的?我真的不知道代码应该做什么......

编辑:
作为@AVH 指出的指针,在此处进行左折叠或右折叠将对订单产生影响。上面的右折叠将调用从最后一个参数开始的成员函数,然后向后工作。左折叠可能是您想要的,并且会做相反的事情。

(..., (foo = foo.bar(args)));

编辑 2:
最后,逗号运算符从左到右强制执行评估,因此在这种情况下,我们如何折叠表达式实际上并不重要。如果我们折叠其他东西,那么,这可能很重要。


以上是C++17-可变参数模板参数-使用模板参数调用前一个返回值的类方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>