首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“合并”荚为一体

“合并”荚为一体
EN

Stack Overflow用户
提问于 2021-10-15 13:07:42
回答 1查看 110关注 0票数 1

有没有一种方法在它们之间组成(或合并,聚合)豆荚?一个直观的解决方案:

代码语言:javascript
复制
struct Base1 { int i; };
struct Base2 { char c; };

struct Derived : Base1, Base2 {};

// in a more generalized way
// template <class... Ts> struct Aggregate : Ts... {};

除了,我们失去了一些东西:

代码语言:javascript
复制
int main()
{
    Derived d {42, 'c'}; // OK
    auto [i, c] = d; // Error
    static_assert(std::is_standard_layout_v<Derived>); // Error
}

我看到,我们可能会在合并的基类之间出现一些模糊、冲突。但是把豆荚合并成一个会很好。我试图达到的结果是:

代码语言:javascript
复制
struct Expected { int i; char c; }; // I want Derived to behave exactly like this

我在反思的领域吗?我应该最终使用宏吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-18 22:00:57

如果我们

不关心派生结构是否为POD

Boost.PFR中,任务非常简单--只需将豆荚转换为元组并将它们连接起来:

代码语言:javascript
复制
template<typename... Ts> using Merge = decltype(std::tuple_cat(
    boost::pfr::structure_to_tuple(std::declval<Ts>())...
));

一个简单的测试:

代码语言:javascript
复制
int main() {
    struct Base1 { int i, j; };
    struct Base2 { char c; };
    using Expected = Merge<Base1, Base2>;
    static_assert(std::is_same_v<Expected, std::tuple<int, int, char>>);
    Expected expected{42, 1337, 'c'};
    auto&& [i, j, c] = expected;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69585223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档