给出以下类模板:
template <template <typename... Args> class Container, typename... Args>
struct container_type_holder {};
我想提取其模板模板参数和可变参数以在另一个上下文中重用。示例:
using c1 = container_type_holder<std::map, std::string, int>;
using c2 = container_type_holder<tt_parameter<c1>, vt_parameter<c1>>;
tt_parameter<c1>
是从c1提取模板模板参数而vt_parameter<c1>
提取其可变参数模板参数的魔术技巧。
为了提取模板模板参数,我尝试在container_type_holder
内添加一个别名,但这没有用,因为它不是完整的类型。为了提取可变参数模板参数,我尝试了相同的策略,但没有成功。
template <template <typename... Args> class Container, typename... Args>
struct container_type_holder
{
using container = Container; // doesnt work
using args = Args...; // ???
};
我不知道这是否可行,我是模板领域的初学者。
答案 0 :(得分:1)
我认为您问的可能不大,但是...您确定不能仅凭输入类型就写出template <typename>
struct container_type_holder;
template <template <typename... Args> class Container, typename... Args>
struct container_type_holder<Container<Args...>>
{
// ...
};
并将您的结构发展为部分专业化吗?
container_type_holder
这种方式是container_type_holder<std::map<std::string, int>> obj;
专业化本身,它提取模板模板参数和可变参数列表
我的意思是:如果您声明一个对象
Container
在专业化中,您拥有std::map
是Args...
和std::string, int
是{{1}}。
答案 1 :(得分:1)
您可以使用这些别名来检索模板参数:
template <template <typename... Args> class Container,
typename... Args>
struct container_type_holder
{
template <typename ... Ts>
using container = Container<Ts...>;
constexpr std::size arg_count = sizeof...(Args);
using args_as_tuple = std::tuple<Args...>;
template <std::size_t I>
using get_arg = typename std::tuple_element<I, std::tuple<Args...>::type;
// And possibly helpers, such as
template <template <typename ...> OtherContainer>
using template_rebind = container_type_holder<OtherContainer, Args...>;
};
然后,用法可能是:
using c1 = container_type_holder<std::map, std::string, int>;
using c2 = c1::template_rebind<std::unordered_map>;
using c3 = container_type_holder<std::vector, std::pair<c1::get_arg<0>, c1::get_arg<1>>>;