gpt4 book ai didi

c++ - std::type_info 用于运行时定义长度的数组

转载 作者:行者123 更新时间:2023-12-02 04:53:35 28 4
gpt4 key购买 nike

当使用typeid(char[10])时,可以获得char[10]std::type_info

现在我遇到的问题是,我需要获取 typeid(char[n]),其中 n 不是 constexpr

有办法做到这一点吗?

我当前的实现只是以递归方式使用模板来生成从 typeid(char[1])typeid(char[100]) 的调用,然后选择使用递归函数进行正确调用,在正确的数字处停止。

虽然这有效,但最多只适用于 100,如果我将其增加得更高,则会生成大量代码或由于递归太深而停止编译

还有其他的可能性吗?

天真的实现可以满足我的要求:

const std::type_info& getTypeInfoForCharArray(size_t len) 
{
switch(len)
{
case 1: return typeid(char[1]);
case 2: return typeid(char[2])
case 3: return typeid(char[3])
case 4: return typeid(char[4])
...
}
}

背景

现在有人可能会问为什么我需要这样一个函数。简而言之,我必须集成来自多个 DLL 的多个结构的定义,其中长度成员可以更改,并且不需要重新编译我正在处理的代码。我需要它来正确分配和访问这些结构的内存,以便我可以调用这些 DLL 中的函数。

实现的一部分是对字段访问进行运行时类型检查,以避免访问冲突,因为 C++ 编译器在编译时不知道结构的情况下无法检查这些冲突。除了数组之外,所有这些都运行良好。

如果我的问题的答案是“不,这是不可能的”,那么我只需要以不同于其他类型的方式对待数组。

最佳答案

您可以使用std::integer_sequence:

template <typename T>
struct Helper;

template <std::size_t ...L>
struct Helper<std::integer_sequence<std::size_t, L...>> {
static const std::type_info &get(std::size_t len) {
static const std::type_info *a[sizeof...(L)] = {&typeid(char[L])...};
return *a[len];
}
};

const std::type_info &getTypeInfoForCharArray(std::size_t len) {
const std::size_t max = 10000;
assert(len<=max);
return Helper<std::make_integer_sequence<std::size_t, max+1>>::get(len);
}

int main() {
auto &t = getTypeInfoForCharArray(10000);
std::cout << t.name() << "\n";
}

使用 clang 可以在约 1 秒内完成编译(最大 大小为 10,000)。

请注意,此解决方案将生成从 0 到 max 的所有 type_info 对象,这可能需要大量数据(对于本例,生成的二进制文件为~1 MB),因为编译器需要将所有 type_info 对象生成到二进制文件中。

我认为如果您事先没有可能的尺寸列表,这是您能做的最好的事情(或者也许您可以考虑一些依赖于编译器的解决方案。就像利用我们知道 type_info::name() 的格式这一事实,但这是一个 hacky 解决方案。但也许这很好,如果您仅使用此功能进行调试)。

关于c++ - std::type_info 用于运行时定义长度的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61027564/

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