从 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
只是为了演示。
假设我有以下 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
只是为了演示。