程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在编译时检查 std::span 是否具有所需的布局?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在编译时检查 std::span 是否具有所需的布局??

开发过程中遇到如何在编译时检查 std::span 是否具有所需的布局?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在编译时检查 std::span 是否具有所需的布局?的解决方法建议,希望对你解决如何在编译时检查 std::span 是否具有所需的布局?有所启发或帮助;

我想在编译时检查 std::span 是否有特定的布局。下面的代码是我到目前为止所得到的。它不起作用。@H_419_1@

#include<bit>
#include<Cassert>
#include<iostream>
#include<span>
#include<type_Traits>
#include<vector>

template<typename T>
struct MySpan {
    T* data;
    std::size_t size;
};

int main() {

    assert(std::is_standard_layout_v<MySpan<int>>);
    assert(std::is_standard_layout_v<std::span<int>>);
    std::vector<int> v{ 1,2,3 };
    std::span const sp{ v };

    auto const mySpan = std::bit_cast<MySpan<int>>(sp);

    assert(sp.data() == mySpan.data);
    assert(sp.size() == mySpan.sizE);
    assert(sizeof(sp) == sizeof(mySpan));
    constexpr bool layoutCompat = std::is_layout_compatible_v<std::span<int>,MySpan<int>>;
    assert(layoutCompat); // assertion Failed,why?
}

解决方法

这个:

std::is_layout_compatible_v<std::span<int>,MySpan<int>>;

应与 MSVC 的实现评估为 true。它确实按该顺序排列字段。事实上,它不是 MSVC 错误,我报告了 here,然后 Casey Carter 转移到了 here。

Casey 的测试用例中我的示例的简化版本(但由我重写以避免使用内部编译器):

#include <type_Traits>

struct B { int x; };
class D : public B {};

static_assert(std::is_layout_compatible_v<D,B>);

这应该是有效的(BD 布局兼容的),但是编译器目前拒绝这样做。这与导致原始 span 检查失败的原因相同。

,

没有反射,就没有机制可以用来确定类型的布局。您可以测试布局兼容性,但无法确定布局本身。也就是说,如果它们的布局不兼容,您就无法确定为什么它们不兼容。

也许 span 实现将大小放在首位。也许大小在基类子对象中,当大小为静态时,该子对象可以为空。谁知道呢。

您不能将代码写入 bit_castspan。无论如何,不​​是跨实现工作的代码。真的,这样做没有意义。您可以让您的类型能够从现有的 span 构建自身。 bit_cast 无论如何都会返回一个新对象所以它不会变得更快或什么的。

大佬总结

以上是大佬教程为你收集整理的如何在编译时检查 std::span 是否具有所需的布局?全部内容,希望文章能够帮你解决如何在编译时检查 std::span 是否具有所需的布局?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。