在 C++ 中使用参数包作为 class 属性可能是 and/or 好的做法吗?
Is it possible and/or good practice to use parameter packs as class attributes in C++?
我正在编写一个简单的模板结构(在 C++ 中),它可以在控制台中显示格式化的 "menu"。我这样做主要是为了玩弄可变参数。该结构的模板通过自动推断输入类型(InputTy
)、提示类型(PromptTy
,通常可能是 std::string
或 const char*
)和参数包来工作消息 (class... MsgTypes
)。 class 的声明如下所示:
template<class InputTy, class PrompTy, class... MsgTypes>
struct Menu
{
// ... Stuff in here ... //
};
我想用这个 class 做的是将 MsgTypes
保存为 "variadic class attribute" 的一种。本质上,这看起来像:
template<class InputTy, class PromptTy, class... MsgTypes>
struct Menu
{
public:
Menu(PromptTy prompt_text, MsgTypes... menu_text) : prompt_text(prompt_text),
menu_text(menu_text) {}
// Displays the formatted menu (uses variadic attribute)
inline void display()
{
display_recurse(menu_text);
std::cout << std::endl << prompt_text;
std::cin >> input_var; std::cin.ignore(10000, '\n');
/* ... Etc ... */
}
protected:
InputTy input_var;
PromptTy prompt_text;
MsgTypes... menu_text; // Variadic attribute
// Recursive function for displaying the text of a menu
template<typename Ty, typename... Types>
inline void display_recurse(Ty cur_line, Types next_lines)
{
std::cout << cur_line << std::endl;
display_recurse(next_lines);
}
// No-arg function overload for recursive generic function with parameter pack
inline void display_recurse() {}
};
Is it possible ... to use parameter packs as class attributes in C++?
不完全是。参数包只能扩展为参数列表、表达式或初始化程序,而不能扩展为声明。
有一个标准模板 std::tuple
,它基本上实现了您可能想要做的事情。它是一个模板 class,每个可变类型参数都是一个成员对象。所以,在你的情况下,你可能有一个成员:
std::tuple<MsgTypes...> menu_text;
如果您想知道,元组本身是如何实现这一点的:您可以将一个模板参数作为非包,将其作为成员,并使用其余参数包递归地继承模板的另一个实例。
我正在编写一个简单的模板结构(在 C++ 中),它可以在控制台中显示格式化的 "menu"。我这样做主要是为了玩弄可变参数。该结构的模板通过自动推断输入类型(InputTy
)、提示类型(PromptTy
,通常可能是 std::string
或 const char*
)和参数包来工作消息 (class... MsgTypes
)。 class 的声明如下所示:
template<class InputTy, class PrompTy, class... MsgTypes>
struct Menu
{
// ... Stuff in here ... //
};
我想用这个 class 做的是将 MsgTypes
保存为 "variadic class attribute" 的一种。本质上,这看起来像:
template<class InputTy, class PromptTy, class... MsgTypes>
struct Menu
{
public:
Menu(PromptTy prompt_text, MsgTypes... menu_text) : prompt_text(prompt_text),
menu_text(menu_text) {}
// Displays the formatted menu (uses variadic attribute)
inline void display()
{
display_recurse(menu_text);
std::cout << std::endl << prompt_text;
std::cin >> input_var; std::cin.ignore(10000, '\n');
/* ... Etc ... */
}
protected:
InputTy input_var;
PromptTy prompt_text;
MsgTypes... menu_text; // Variadic attribute
// Recursive function for displaying the text of a menu
template<typename Ty, typename... Types>
inline void display_recurse(Ty cur_line, Types next_lines)
{
std::cout << cur_line << std::endl;
display_recurse(next_lines);
}
// No-arg function overload for recursive generic function with parameter pack
inline void display_recurse() {}
};
Is it possible ... to use parameter packs as class attributes in C++?
不完全是。参数包只能扩展为参数列表、表达式或初始化程序,而不能扩展为声明。
有一个标准模板 std::tuple
,它基本上实现了您可能想要做的事情。它是一个模板 class,每个可变类型参数都是一个成员对象。所以,在你的情况下,你可能有一个成员:
std::tuple<MsgTypes...> menu_text;
如果您想知道,元组本身是如何实现这一点的:您可以将一个模板参数作为非包,将其作为成员,并使用其余参数包递归地继承模板的另一个实例。