虚拟阵列大小

Virtual array sizes

class 是否可以声明一个数组,该数组可以在派生 class 中用不同长度的数组覆盖?我知道我可以只使用 std::vector 但它用于游戏引擎的性能关键阶段,并且由于长度在编译时已知,因此似乎应该可以静态地进行。

我的目标是这样的,但没有不可能的成员变量的要求,它既是虚拟的又是静态的:

struct F {
  virtual static const size_t n;
  Signal[n] inputs;
  Signal getInput(size_t i)
  {
    if(i<n)
      return inputs[i];
  }
};
struct Binary : F {
  static const size_t n=2;
};

当你说编译时想想,template or constexpr。 像这样:

#include <cassert>
#include <array>
#include <iostream>

//-----------------------------------------------------------------------------

struct Signal
{
    std::size_t id = ++s_id;
    static std::size_t s_id;
};

std::size_t Signal::s_id{ 0 };

//-----------------------------------------------------------------------------

struct FBase
{
    virtual std::size_t size() const = 0;
    virtual ~FBase() = default;

protected:
    FBase() = default;

};

//-----------------------------------------------------------------------------


template<std::size_t N>
struct F : 
    public FBase
{
    Signal inputs[N]{};

    Signal getInput(size_t i)
    {
        assert(i < N);
        return inputs[i];
    }

    std::size_t size() const override
    {
        return N;
    }
};

//-----------------------------------------------------------------------------

struct Binary : 
    public F<2ul>
{
};

struct Trinary :
    public F<3ul>
{
};

//-----------------------------------------------------------------------------

int main()
{
    Binary bin;
    Trinary tri;

    auto signal = bin.getInput(1ul);
    std::cout << signal.id << "\n";

    std::cout << tri.size();
    
    return 0;
}

也许你可以在基础class中使用一个指向Signal的指针,然后每个继承class都会将指针初始化为一个不同大小的数组。这将解决 class 维度上的问题。只记得声明virtual de destructor 并手动删除数组的内存。