问题Meta-Function to get the first template of a list of templates @ vittorio-romeo给出了编写元函数的答案,以获取模板列表的第一个模板。现在我想编写一个元函数,它接受一个模板(作为一个元函数)和一个要处理的模板列表:
template<template<typename> typename F,
template<template<typename> typename...> typename TL> struct transform_T;
template<template<typename> typename F,
template<template<typename> typename...> typename TL,
template<typename> typename... I>
struct transform_T<F, TL<I...>> {
};
但是这个定义没有编译:https://wandbox.org/permlink/CnY2DOGbAqW4Evq4
编辑: 随着下面的变化,它工作。这是一个完整的例子:
#include <cstdint>
#include <cstddef>
template<typename... T>
struct List {};
template<template<typename> typename... TT>
struct TList {};
template<template<template<typename> typename> typename F,
typename TL> struct transform_T;
template<template<template<typename> typename> typename F,
template<template<typename> typename...> typename TL,
template<typename> typename... I>
struct transform_T<F, TL<I...>> {
typedef List<typename F<I>::type...> type;
};
template<typename>
struct A {};
template<typename>
struct B {};
using l1 = TList<A, B>;
template<template<typename> typename X>
struct F {
typedef X<int> type;
};
using l2 = typename transform_T<F, l1>::type;
l2::_; // List<A<int>, B<int>>
int main() {
}
我的问题仍然是,我们必须在/ primary / template中只编写typename TL
吗?
答案 0 :(得分:1)
您的主要模板定义应与专业化参数匹配:
template<template<typename> typename F1,typename TL> struct transform_T;
这是否是您真正想要的取决于您想要执行的“处理”类型。
我的问题仍然是,我们必须在/ primary / template中只编写typename TL吗?
主模板声明给定模板名称的模板参数,也就是说,它告诉编译器某些名称是模板,并且其参数是您指定的类型(类型,非类型,模板模板参数)。 ..)。
部分特化通过类型推导声明一组新的模板参数与主要模板参数匹配;很明显,他们的种类必须匹配。
在原始代码中,您将TL<I...>
(即类型)传递给模板模板类型的参数(template<template<typename> typename...> typename TL
)。