首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许模板化类的结构化绑定

允许模板化类的结构化绑定
EN

Stack Overflow用户
提问于 2017-12-27 18:53:39
回答 1查看 137关注 0票数 1

所以我有一个小类,我想在其中添加结构化绑定支持。然而,我不知道如何用我的模板化类来专门化std::tuple_elementstd::tuple_size。这是我的尝试:

代码语言:javascript
复制
template<typename... Cmps>
struct CmpGroup
{
    std::array<void*, sizeof...(Cmps)> cmps;

    template<typename C>
    C& get()
    {
        constexpr int index = GetIndexInPack<C, Cmps...>::value;
        static_assert(index != -1);
        return *static_cast<C*>(index);
    }

    template<size_t I>
    auto& get()
    {
        static_assert(I < sizeof...(Cmps));
        using CmpType = typename GetTypeInPack<I, Cmps...>::type;
        return *static_cast<CmpType*>(cmps[I]);
    }
};

namespace std
{
    template<typename... Types>
    struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>;

    template<std::size_t N, typename... Types>
    struct tuple_element<N, CmpGroup<Types...>> {
        //got this from: https://blog.tartanllama.xyz/structured-bindings/
        using type = decltype(std::declval<CmpGroup<Types...>>().template get<N>());
    };
}

(为了清楚起见,我省略了一些具体实现的东西,完整的代码片段可以在here上找到)

但是,这会导致tuple_size专门化产生编译错误:error C2143: syntax error: missing ',' before ';'

有没有可能让模板化的类有结构化的绑定,或者我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-27 19:15:51

事实证明,我的tuple_size专门化需要一个我忽略的主体。

代码语言:javascript
复制
template<typename... Types>
struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>{};
------------------------------------------------------------------------------------------^^

感谢@BoPersson指出这一点!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47990899

复制
相关文章

相似问题

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