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

Extract list of types from std::tuple for template class

假设我有以下 class

class Example {
public:
    using value_type = std::tuple<
        uint8_t,
        uint8_t,
        uint16_t
    >;

private:
    value_type _value;
};

现在,我希望能够基于此类型创建另一个 class,将每个 classes 类型包装在另一种类型中。基于 ,我知道我可以通过以下方式实现我的一半目标:

template <typename T>
class Wrapper;

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

但是,如果我只知道 T,我想不通的是如何获得 ARGS,其中 T 是示例。我希望能够按如下方式使用 ExampleWrapper

ExampleWrapper<Example> myWrapper;

您可以使用模板偏特化得到 ARGS:

template <typename T>
class Wrapper;

template <typename Tuple>
class ExampleWrapper;

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

然后:

ExampleWrapper<Example::value_type> myWrapper;

为 return 所需类型创建一个静态函数并在其上使用 decltype

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。我制作它们 public 只是为了演示。

Demo