gpt4 book ai didi

c++ - 如何使用静态数组元素作为具有不同模板实例化的静态对象数组的索引

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:15 24 4
gpt4 key购买 nike

如何使用静态数组元素作为不同模板实例化的静态对象数组的索引?

我遇到了明显的编译器错误:'N' 的无效模板参数,预期的编译时常量表达式。

我不知道是否有非 C++11 的答案。希望我可以在 vs2013 中使用一些现代的东西...:)

我正在尝试像这样静态存储数据:

static const char* size1Array[1] =
{
"hello"
};

static const char* size2Array[2] =
{
"foo",
"bar"
};

static const size_t ARRAYSIZES[2] =
{
1,
2
};

// Empty parent
struct DataParent {};

template <size_t N>
struct DataChild : DataParent
{
DataChild(const char*(*arrIn)[N])
: arr(arrIn) {}

const char*(*arr)[N];
};

// The arrays are of different sizes, hence the DataParent to keep them in a static array
static DataParent DataTable[ 2 ] =
{
DataChild< 1 >(&size1Array),
DataChild< 2 >(&size2Array)
};

int main()
{
int index = 1;
// The tricky cast that won't compile (ARRAYSIZES[index]
std::cout << ((DataChild< ARRAYSIZES[index] >*)&DataTable[index])->arr[0] << std::endl;
}

我想访问静态数组中的对象,但我无法使用非编译常量进行访问。我正在运行 VS2013 更新 4。

最佳答案

您有几个问题:

  • 将 DataParent 存储为值时的切片问题

所以

static DataParent DataTable[2] =
{
DataChild<1>(&size1Array), // Slicing
DataChild<2>(&size2Array) // Slicing
};

应该是这样的:

static DataChild<1> child1(&size1Array);
static DataChild<2> child2(&size2Array);

static DataParent* DataTable[2] = {&child1, &child2};

因此您的类型转换不再是 UB。

  • 编译时间问题:

    const size_t ARRAYSIZES[2] = { 1, 2 };
    int index = 1;

    以下不是编译时间常量:

    ARRAYSIZES[index] // Not a compile time value.

关于c++ - 如何使用静态数组元素作为具有不同模板实例化的静态对象数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30520574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com