繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM