如何将模板内部的模板作为模板模板参数传递给另一个模板?
How do I pass a template that's inside a template to another template as a template template parameter?
脑子疼了吗?
我正在研究 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
获取 transformer
的 template template
,但没有传递给它的 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 argument for template template parameter must be a class template or type alias template."
这是变压器:
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>;
};
我宁愿不必编写和维护 transformer
的多个版本,这就是为什么我想使用包装器将传入的 template
转换为需要未使用 size_t
.
有没有办法让我正确地通过这个template
?
供参考,在我要传的名字前加上template<>
and/ortypename
不行
正确的语法是
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
.
的类型
脑子疼了吗?
我正在研究 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
获取 transformer
的 template template
,但没有传递给它的 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 argument for template template parameter must be a class template or type alias template."
这是变压器:
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>;
};
我宁愿不必编写和维护 transformer
的多个版本,这就是为什么我想使用包装器将传入的 template
转换为需要未使用 size_t
.
有没有办法让我正确地通过这个template
?
供参考,在我要传的名字前加上template<>
and/ortypename
不行
正确的语法是
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
.