如何将模板内的模板作为模板模板参数传递给另一个模板?

时间:2015-01-01 17:54:13

标签: c++ templates c++11 template-templates

大脑疼了吗?

我正在处理tuple类型转换助手,并遇到问题。要么我重复代码,要么我包装template template。我虽然无法解决这个问题。

以下是我需要使用的内容:

template<template<typename> class trans> struct no_index_transformer
{
    template<size_t, typename transform_t> struct transformer
    {
        using t = typename trans<transform_t>::t;
    };
};

no_index_transformer需要template template transformer传递给size_t(索引)的transformer。内部template no_index_transformer<>::transformer是我需要传递的内容。我这样做的时候会收到错误,所以我不确定通过template<template<typename> class transformer, typename tuple> using transform_tuple_t = transform_tuple_index<no_index_transformer<transformer>::transformer, 0, tuple>::t; 的正确方法是什么。

我在以下一行收到错误:

template<typename, typename> struct tuple_cat;
template<typename... types_one, typename... types_two> struct tuple_cat<std::tuple<types_one...>, std::tuple<types_two...>>
{
public:
    using t = std::tuple<types_one..., types_two...>;
};

template<template<size_t, typename> class transformer, size_t index, typename tuple> class transform_tuple_index;
template<template<size_t, typename> class transformer, size_t index, typename current_t, typename... types> class transform_tuple_index<transformer, index, std::tuple<current_t, types...>>
{
    using current = std::tuple<typename transformer<index, current_t>::t>;
    using next = typename transform_tuple_index<transformer, index + 1, std::tuple<types...>>::t;
    using combined = typename tuple_cat<current, next>::t;
    static constexpr bool test_{ std::is_same<std::tuple<void>, next>::value };

public:
    using t = typename std::conditional<test_, current, combined>::type;
};
template<template<size_t, typename> class transformer, size_t index> class transform_tuple_index<transformer, index, std::tuple<>>
{
public:
    using t = std::tuple<void>;
};

&#34;模板模板参数的模板参数必须是类模板或类型别名模板。&#34;

这是变压器:

transformer

我不必编写和维护template的多个版本,这就是为什么我想使用包装器将传入的size_t转换为一个使用未使用的template

我有没有办法正确传递此template<>

作为参考,在我要传递的名称之前添加typename和/或{{1}}并不起作用。

1 个答案:

答案 0 :(得分:6)

正确的语法是

template<template<typename> class transformer, typename tuple> 
using transform_tuple_t                  
    = typename transform_tuple_index<no_index_transformer<transformer>::template transformer, 0, tuple>::t;
//    ^^^^^^^^                                                          ^^^^^^^^

由于no_index_transformer<transformer>是依赖的,您需要告诉编译器no_index_transformer<transformer>::transformer是一个带有template的模板(不是 template<>)。由于transform_tuple_index<...>是依赖的,因此您需要告诉编译器transform_tuple_index<...>::t是使用typename的类型。