Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;17-可变模板参数-使用模板参数调用上一个返回值的类方法_C++_C++17_Variadic Templates - Fatal编程技术网

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

C++ C++;17-可变模板参数-使用模板参数调用上一个返回值的类方法,c++,c++17,variadic-templates,C++,C++17,Variadic Templates,我有以下代码: 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){

我有以下代码:

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;
}
基于可变模板参数
args

我在看折叠表达式,但这似乎不是我需要的工作。我可以折叠方法以单独调用,但不能根据前一个方法的结果调用下一个方法


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

您可以使用折叠表达式

((foo = foo.bar(args)), ...);
我们需要在赋值周围添加一个
()
,以使编译器接受语法。 我想这就是你想要的?我真的不知道代码应该做什么

编辑: 正如@AVH所指出的,在这里进行左折叠或右折叠将对顺序产生影响。上面的右折页将从最后一个参数开始调用成员函数,并向后运行。左折可能是你想要的,但效果正好相反

(..., (foo = foo.bar(args)));
编辑2:
最后,逗号运算符从左到右强制求值,因此在本例中,如何折叠表达式实际上并不重要。如果我们将其他功能折叠起来,那么这可能很重要。

以下是每个in-pack功能的通用功能:

template<class F, class...Args>
constexpr F for_each(F f, Args&&...args) {
  std::initializer_list<int>{((void)f(std::forward<Args>(args)), 0)...};
  return f;
}
模板
每个参数的常量表达式F(F、参数和参数){
std::initializer_list{((void)f(std::forward)。将其与lambda一起使用:

template <typename ... T>
int foo(T&& ... args){            
    Foo foo;
    for_each([&](auto&& x){ foo = foo.bar(std::forward<decltype(x)>(x));}
           , std::forward<T>(args) ...>);
    return foo.sum;
}
模板
intfoo(T&…args){
富富,;
对于_each([&](auto&&x){foo=foo.bar(std::forward(x));}
,std::forward(args)…>);
返回foo.sum;
}

这基本上与公认的解决方案相同,但函数是抽象的。

我想您可能想要左折,即
(…,(foo=foo.bar(args)))
@AVH好的一点,我会注意到这一点。我总是觉得语法有点奇怪,因为大多数示例代码显示右折叠,而我假设在大多数“现实生活”代码中,您希望左折叠。在这种情况下,左折叠或右折叠没有影响,
(a,(b,c))
((a,b),c)相同
使用逗号运算符时。@ILCAPIANO Right,因为逗号运算符从左到右强制求值。
template <typename ... T>
int foo(T&& ... args){            
    Foo foo;
    for_each([&](auto&& x){ foo = foo.bar(std::forward<decltype(x)>(x));}
           , std::forward<T>(args) ...>);
    return foo.sum;
}