Mic*_*nda 0 c++ templates template-templates c++11
大脑疼了吗?
我正在研究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;
};
};
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
"模板模板参数的模板参数必须是类模板或类型别名模板."
这是变压器:
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>;
};
Run Code Online (Sandbox Code Playgroud)
我宁愿不必编写和维护多个版本transformer,这就是为什么我想使用包装器将传入转换template为使用未使用的传入size_t.
有没有办法让我正确地通过这个template?
作为参考,添加template<>和/或typename在我想要传递的名称之前不起作用.
正确的语法是
template<template<typename> class transformer, typename tuple>
using transform_tuple_t
= typename transform_tuple_index<no_index_transformer<transformer>::template transformer, 0, tuple>::t;
// ^^^^^^^^ ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
既然no_index_transformer<transformer>是依赖的,你需要告诉编译器这no_index_transformer<transformer>::transformer是一个模板template(不是 template<>).由于transform_tuple_index<...>是依赖的,您需要告诉编译器transform_tuple_index<...>::t使用的类型typename.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |