[英]std::type_info for array of runtime defined length
当使用typeid(char[10])
时,可以获得char[10]
[10] 的std::type_info
。
现在我有一个问题,我需要获取typeid(char[n])
,其中n
不是constexpr
。
有没有办法做到这一点?
我当前的实现只是以递归方式使用模板来生成从typeid(char[1])
到typeid(char[100])
的调用,然后使用停止在正确数字的递归 function 选择正确的调用。
虽然这有效,但它最多只能工作 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])
...
}
}
背景
现在有人可能会问为什么我需要这样的 function。 简而言之,我必须集成来自多个 DLL 的多个结构的定义,其中长度成员可以更改,并且不需要重新编译我正在处理的代码。 我需要这个来为这些结构正确分配和访问 memory,以便我可以调用那些 DLL 中的函数。
部分实现是对字段访问的运行时类型检查以避免访问冲突,因为 C++ 编译器无法在编译时不知道结构的情况下检查那些。 除了 arrays 之外,所有这些都运行良好。
如果我的问题的答案是“不,它不能完成”,那么我只需要区别对待 arrays 与其他类型。
您可以使用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( max
大小为 10,000)在约 1 秒内编译。
请注意,此解决方案将生成从 0 到max
的所有type_info
对象,这可能需要大量数据(对于本示例,生成的二进制文件约为 1 MB),因为编译器需要将所有type_info
对象生成到二进制文件中.
我认为如果您事先没有可能的大小列表,这是您能做的最好的事情(或者您可以考虑一些依赖于编译器的解决方案。就像利用我们知道type_info::name()
格式的事实一样, 但这是一个 hacky 解决方案。但如果您将此功能仅用于调试,也许这很好)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.