首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从std::tuple提取模板类的类型列表

从std::tuple提取模板类的类型列表
EN

Stack Overflow用户
提问于 2022-02-04 17:09:44
回答 2查看 337关注 0票数 4

假设我有以下课程

代码语言:javascript
复制
class Example {
public:
    using value_type = std::tuple<
        uint8_t,
        uint8_t,
        uint16_t
    >;

private:
    value_type _value;
};

现在,我希望能够基于这个类型创建另一个类,它封装了另一个类型中的每个类类型。基于将每种类型包装在模板类中的可变模板中。,我知道我可以通过以下方式实现我一半的目标:

代码语言:javascript
复制
template <typename T>
class Wrapper;

template <typename ... ARGS>
class ExampleWrapper {
private:
    std::tuple<Wrapper<ARGS>...> _args;
};

但是,如果我只知道T ( T就是其中的例子),那么我想不出如何获得T。我希望能够按以下方式使用ExampleWrapper

代码语言:javascript
复制
ExampleWrapper<Example> myWrapper;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-04 17:17:13

可以使用模板部分专门化来获取ARGS

代码语言:javascript
复制
template <typename T>
class Wrapper;

template <typename Tuple>
class ExampleWrapper;

template <typename ... ARGS>
class ExampleWrapper<std::tuple<ARGS...>> {
private:
    std::tuple<Wrapper<ARGS>...> _args;
};

然后:

代码语言:javascript
复制
ExampleWrapper<Example::value_type> myWrapper;
票数 7
EN

Stack Overflow用户

发布于 2022-02-04 18:10:02

创建一个静态函数来返回所需的类型并在其上使用decltype

代码语言:javascript
复制
template <typename T>
class Wrapper{};

template<class T>
class ExampleWrapper {
    public:
    template<typename ...Args>
    static std::tuple<Wrapper<Args>...> fnc(std::tuple<Args...>);  
    using value_type = decltype( fnc( std::declval<typename T::value_type>() ) );

    private:
    value_type _args;  
};
// The type of `ExampleWrapper<Example>::_args` would be
// std::tuple<Wrapper<unsigned char>, Wrapper<unsigned char>, Wrapper<short unsigned int> >
}

不需要将静态函数声明和value_type别名公开。我让他们public只是为了演示。

演示

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

https://stackoverflow.com/questions/70990248

复制
相关文章

相似问题

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