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
传递给调用,并且出现了错误。您能解释一下为什么无法在此处推导模板参数吗?@Victorstd::forward
就是这样设计的是的,您必须显式指定模板参数。请参阅我之前询问的。
foo(x, std::forward<ExtraParams>(extra)...);