虚拟阵列大小
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 并手动删除数组的内存。
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 并手动删除数组的内存。