在 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::stringconst 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;

如果您想知道,元组本身是如何实现这一点的:您可以将一个模板参数作为非包,将其作为成员,并使用其余参数包递归地继承模板的另一个实例。