gpt4 book ai didi

c++ - C++ 中的类型双关问题

转载 作者:行者123 更新时间:2023-11-30 03:15:05 26 4
gpt4 key购买 nike

我有一个模板类,它的模板参数是 bool 值 Dynamic<bool> .无论参数是真还是假,它都具有完全相同的数据成员。它们只是成员函数不同。

有一种情况我需要暂时将一个转换为另一个,而不是使用复制/移动构造函数。所以我求助于双关语。为了确保它会导致问题,我使用了两个 static_asserts :

d_true=Dynamic<true>(...);
...
static_assert(sizeof(Dynamic<true>)==sizeof(Dynamic<false>),"Dynamic size mismatch");
static_assert(alignof(Dynamic<true>)==alignof(Dynamic<false>),"Dynamic align mismatch");
Dynamic<false>& d_false=*reinterpret_cast<Dynamic<false>*>(&d_true);
...

所以我认为我正在做的事情是安全的,如果有任何问题,编译器会给我一个 static_assert错误。但是,gcc 给出警告:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

我的问题是双重的:我正在做的事情是实现这一目标的最佳方式吗?如果是,如何让 gcc 相信它是安全的,并消除警告?

最佳答案

一个明显的可能性是将两者共有的数据分离到它自己的类(或结构)中,然后在需要时从对象中获取它。

struct Common {
// ...
};

template <bool b>
class Dynamic {
Common c;
public:
Common &get_data() { return c; }
// ...
};

从那里开始,剩下的似乎很明显——当您需要来自 Dynamic<whatever> 的数据时, 你调用 get_data()然后开始吧。

当然,一般主题也有变体——例如,您可以改用继承:

struct Common { /* ... */ };

template <bool t>
class Dynamic : public Common {
// ...
};

这消除了额外的 c.以前的版本需要对公共(public)数据的每个引用,但(至少在我看来)继承可能为此付出的代价太高。

关于c++ - C++ 中的类型双关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57318518/

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