C++ 在C+;中使用参数包作为类属性是否可能和/或良好做法+;?

C++ 在C+;中使用参数包作为类属性是否可能和/或良好做法+;?,c++,oop,templates,variadic-templates,generic-programming,C++,Oop,Templates,Variadic Templates,Generic Programming,我正在编写一个简单的模板结构(用C++编写),它可以在控制台中显示格式化的“菜单”。我这样做主要是为了玩弄可变参数。结构的模板通过自动推断输入类型(InputTy)、提示类型(prompty,通常可能是std::string或const char*)和消息的参数包(class…MsgTypes)来工作。该类的声明如下所示: 模板 结构菜单 { //…这里的东西// }; 我想用这个类做的是将MsgTypes保存为一种“可变类属性”。基本上,这看起来像: 模板 结构菜单 { 公众: 菜单(提示文

我正在编写一个简单的模板结构(用C++编写),它可以在控制台中显示格式化的“菜单”。我这样做主要是为了玩弄可变参数。结构的模板通过自动推断输入类型(
InputTy
)、提示类型(
prompty
,通常可能是
std::string
const char*
)和消息的参数包(
class…MsgTypes
)来工作。该类的声明如下所示:

模板
结构菜单
{
//…这里的东西//
};
我想用这个类做的是将
MsgTypes
保存为一种“可变类属性”。基本上,这看起来像:

模板
结构菜单
{
公众:
菜单(提示文字,MSG类型…菜单文字):提示文字(提示文字),
菜单文本(菜单文本){}
//显示格式化菜单(使用可变属性)
内联无效显示()
{
显示递归(菜单文本);
std::cout input_var;std::cin.ignore(10000,“\n”);
/*……等等*/
}
受保护的:
输入变量;
提示文字;
MsgTypes…菜单_text;//变量属性
//用于显示菜单文本的递归函数
模板
内联无效显示递归(当前行,键入下一行)
{
标准::cout

是否可以在C++中使用参数包作为类属性? 不完全正确。参数包只能扩展为参数列表、表达式或初始值设定项,而不能扩展为声明

有一个标准模板
std::tuple
,它基本上实现了您可能尝试执行的操作。它是一个模板类,每个变量类型参数都作为一个成员对象。因此,在您的情况下,您可能有一个成员:

std::tuple<MsgTypes...> menu_text;
std::元组菜单\u文本;

C++:如果你想知道,元组本身是如何实现的:你可以将一个模板参数当作非包,将它作为成员,并用其余的参数包递归继承模板的另一个实例。你会得到三个不同的答案。根据情况,这可能是或可能不是正确的事情。作为一个C++开发者,你可以决定,什么是“好的实践”。,或者不是。

std::tuple
s与
std::vector
s的区别在于它们可以在同一个容器中保存不同的数据类型吗?@DrakeJohnson是的。也不同于在运行时确定向量,而不能确定tuple。