【问题标题】:Variadic templates construct template list可变参数模板构造模板列表
【发布时间】:2026-01-13 22:10:01
【问题描述】:

在下面的代码中,如何使用列表b来创建object_b,就像使用列表a手动创建object_a一样?

#include <list>

template <int...Args>
class Object {};

int main() {
    std::list<int> a = {1,2,3,4,5};
    Object<1,2,3,4,5> object_a;
    std::list<int> b;
      // do whatever with b
    // Object< ? > object_b;  // how to use b to create object_b?
}

【问题讨论】:

  • 这在 C++ 中是不可能的。您不能将运行时对象转换为编译时模板。
  • list a 未用于创建 object_a(手动或其他方式)。
  • 这是不可能的。也许您想改用std::tuple&lt;...&gt;

标签: c++ templates variadic


【解决方案1】:

您是否要求能够使用与 std::list 相同的语法来构造您的对象?

您可以使用 std::initializer_list 来实现这一点。

class Object{

    Object(const std::initialize_list<int>& vars)
    {
          // do stuff with the vars. 
    }
};

你可以这样做

Object my_object = {1, 2, 3, 4}; 

【讨论】:

  • 没有。 Object 不是一个单一的类,而是由(任意多个)整数以任何形式参数化的一系列类。然后我想使用已知的整数列表(或元组或其他)创建 Object 系列的特定类的实例。
【解决方案2】:

那么我最好的解决方案:

#include <list>

template <std::list<int>& L>
class Object {};

std::list<int> globalList;

int main() {
    std::list<int> a = {1,2,3,4,5};
    globalList = a;
    Object<globalList> object_a;
}

有更好的想法吗?有什么办法不引入全局变量?

【讨论】:

  • 好吧,我设法使用 a 的元素创建了带有模板参数的对象。只要我可以使用类中的这些元素来做任何事情,我更改模板的性质就可以满足我的需求。但是我现在不喜欢全局变量进入图片。
  • 我认为 0x499602D2 使用 std::tuple 的建议可以避免创建全局变量,对吧?
  • @CantChooseUserNames。对不起,我没有看到你的链接。感谢您为我输入该代码。非常感谢。