Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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+中运行的参数+;_C++_Templates_C++17_Variadic Templates_Variadic Functions - Fatal编程技术网

C++ 接受一组对象类型的所有组合可能性,作为在C+中运行的参数+;

C++ 接受一组对象类型的所有组合可能性,作为在C+中运行的参数+;,c++,templates,c++17,variadic-templates,variadic-functions,C++,Templates,C++17,Variadic Templates,Variadic Functions,给定三个不同的空structs、A、B和C,我想让函数foo接受这三个参数中任意数量的任意组合,例如: struct A{}; 结构B{}; 结构C{}; //Foo有一个必需的参数,该参数必须是给定的第一个参数。其他任何东西都是可选的。 傅(1),; foo(1,A{}); foo(1,B{}); foo(1,B{},A{}); foo(1,A{},C{},B{}); 我认为可变模板和函数重载在这种情况下会有所帮助,所以我尝试了以下内容: struct A{}; 结构B{}; 结构C{};

给定三个不同的空
structs
A
B
C
,我想让函数
foo
接受这三个参数中任意数量的任意组合,例如:

struct A{};
结构B{};
结构C{};
//Foo有一个必需的参数,该参数必须是给定的第一个参数。其他任何东西都是可选的。
傅(1),;
foo(1,A{});
foo(1,B{});
foo(1,B{},A{});
foo(1,A{},C{},B{});
我认为可变模板和函数重载在这种情况下会有所帮助,所以我尝试了以下内容:

struct A{};
结构B{};
结构C{};
模板
void foo(int x,ExtraParams&&…)
{

std::cout问题是,当您将参数
extra
作为
foo(x,extra…)
传递给
foo的其他重载时,它们是且不能绑定到右值引用,如
A&
B&

(强调矿山)

以下表达式是左值表达式:

  • 变量、函数
    、模板参数对象(自C++20以来)
    或数据成员的名称,无论其类型如何,例如 std::cin或std::endl.即使变量的类型是右值 引用时,由其名称组成的表达式是左值 表情
您应该使用转发参数(如果传递的原始参数是右值,则作为右值,即利用右值)

foo(x,std::forward(额外)…);

我也尝试过在我的代码中使用
std::forward
,但没有在此处发布。但是,我没有将模板参数
ExtraParams
传递给调用,并且出现了错误。您能解释一下为什么无法在此处推导模板参数吗?@Victor
std::forward
就是这样设计的是的,您必须显式指定模板参数。请参阅我之前询问的。
foo(x, std::forward<ExtraParams>(extra)...);