在编译时添加成员,无需复制/移动构造函数

Add members at compile time without copy/move constructors

提问人:Guillaume BERLAND 提问时间:1/15/2023 最后编辑:Guillaume17Guillaume BERLAND 更新时间:1/15/2023 访问量:67

问:

我正在学习可变参数模板和折叠表达式。 我想避免使用动态分配和指针。

为了说明我的问题,我创建了继承自 I_Foo 的 Foo(删除复制和移动构造函数)类。

class I_Foo
{
public:
    virtual void Do() = 0;
};

template <int a, int b>
class Foo : public I_Foo
{
public:
    explicit Foo(int x) : m_x {x} {}
    Foo(const Foo &) = delete;
    virtual ~Foo() {}
    Foo & operator=(const Foo &) = delete;
protected:
    virtual void Do() override { /* Do something */}
private:
    static constexpr std::size_t k_ArraySize {a * b};
    std::array<int, k_ArraySize> m_Array {};
    int m_x;
};

我想创建一个包含 x 的 Pool 类I_Foo在编译时设置,但我不知道该怎么做。我完全迷失了。 实例化池可能如下所示:

template<typename... Args>
class Pool
{
public:
    explicit Pool(Args&&... args) : /* No idea */ {}
private:
    Foo1
    Foo2
    ...
    FooX
};

Pool<Foo<1,2>, Foo<3,2>> l_t_Pool { Foo<1,2>{1}, Foo<3,2>{2} };

我缺乏知识,无法知道这是否可行。:(

C++ C++17 variadic-templates 复制省略 参数包

评论

0赞 phuclv 1/15/2023
Add members at compile time这是不可能的。它需要动态调度和反射才能可用
0赞 user17732522 1/15/2023
我不明白你想做什么。暂时忘记“编译时”和“可变”。如果你只有一个,并且你可以在运行时工作,你希望你的构造函数做什么? 是抽象的,因此类中不能有该类型的成员。即使你用它来代替它,如果不使用动态分配,你希望实际对象存储在哪里?如果 a 的值和类型是在编译时决定的,为什么不能直接存储呢?I_Foo1PoolPoolI_Foo1I_Foo1*FooPoolFoo
1赞 Guillaume BERLAND 1/15/2023
使用元组,我们可以存储所有 Foo?
0赞 QuentinUK 1/15/2023
您需要将它们存储在 std::vector 中(其他集合可用),因为您无法在运行时更改类结构。
2赞 Igor Tandetnik 1/15/2023
然后是这样的事情。我删除了基类,因为这与示例无关。

答: 暂无答案