C++ 检查两种类型是否可以使用别名

C++ 检查两种类型是否可以使用别名,c++,typetraits,C++,Typetraits,我有一个公共API函数(在库头中),它接受struct foo&,该函数的内部实现调用需要struct bar*的第三方依赖函数 我不想将第三方依赖关系拉入公共头中,因为库将以二进制形式分发,并且此依赖关系是一个实现细节 但是,我不打算向foo附加任何附加信息,而是希望能够执行reinterpret\u cast(&foo),以减少我必须执行的副本数量(这是一个非常频繁调用的函数) 标准库是否有type\u trait或其他机制来检查foo和bar的结构是否相同?我知道这将需要更多的维护,以确保

我有一个公共API函数(在库头中),它接受
struct foo&
,该函数的内部实现调用需要
struct bar*
的第三方依赖函数

我不想将第三方依赖关系拉入公共头中,因为库将以二进制形式分发,并且此依赖关系是一个实现细节

但是,我不打算向
foo
附加任何附加信息,而是希望能够执行
reinterpret\u cast(&foo)
,以减少我必须执行的副本数量(这是一个非常频繁调用的函数)

标准库是否有
type\u trait
或其他机制来检查
foo
bar
的结构是否相同?我知道这将需要更多的维护,以确保头部也匹配内部依赖的类型定义,但这很好,因为它不太可能很快改变

最终我需要像这样的东西

structfoo{
INTA;
常量字符*b;
};
结构条{
INTC;
常量字符*d;
};
静态断言(
std::可别名为::value,//
重新解释强制转换(&f)
始终为UB,因为存在严格的别名

如果没有严格的别名,您可以使用c++20的std::is_layout_compatible
,但没有任何编译器支持

你可以使用这样的黑客:

模板
constexpr bool是相同的成员类型(T foo::*,U bar::*){
返回标准::是否相同;
}
#定义具有相同的成员(foo\u名称,bar\u名称)(offsetof(foo,foo\u名称)==offsetof(bar,bar\u名称)和&is\u相同的成员类型(&foo::foo\u名称,&bar::bar\u名称))
//如果添加了新成员,“添加更多”将有\u相同的\u成员调用
静态断言(
sizeof(foo)=sizeof(bar)&&
std::是标准布局吗&&std::是标准布局吗&&
有相同的成员(a,c)&&
拥有相同的成员(b,d),
“foo必须在结构上等同于bar”
);
#undef具有相同的成员

“标准库是否有一个
type\u trait
或其他机制来检查
foo
bar
的结构是否相同?”-不,不是。简单地将
foo
作为
bar
的别名有什么错?@RemyLebeau需要向这个库的用户公开第三方的
bar
头,OP说他们希望避免这种情况OP正在寻找某种形式的简单PIMPL,但我不能立即确定具体的实现方式是的,或多或少,我希望如果我们更新了依赖项,并且忘记了更新结构定义(如果它在该依赖项中发生更改),那么能够防止出现错误。a sizeof()例如,如果要对成员重新排序,断言将失败。我为此使用了一个
pimpl
类。我丢失了我的类,但刚刚删除了这个类。它就像一个混合的可选/唯一\u ptr。在这里,我在
foo
中创建了一个32位缓冲区,并在构造函数的缓冲区中放置了一个
bar
。伙计,你不是在开玩笑吧-
与布局兼容吗?
根本没有任何编译器供应商开发过。即使检查最新的clang-12发行版,库中也没有显示任何与该名称相关的内容。这可能是我目前所做的最好的,因为它是一个小结构。谢谢:)有一个标准的trait
std::is_correlative_member
,可以用来代替宏。我也不知道供应商是否已经实现了这一点。