让我们调用一个看起来像T<Us...>
类型更高的类型的类型。对于特定的高级类型SomeType
(假设它是std::vector<int>
),我想使用类型特征从中提取T
部分(std::vector
)。我可以这样做:
template<typename>
struct HKT;
template<template <typename...> class T, typename... Us>
struct HKT<T<Us...>> {
template<typename... Vs>
using type = T<Vs...>;
};
现在我可以HKT<SomeType>::type<Foo>
定义std::vector<Foo>
。
但是我试图摆脱::type
部分,就像typename std::enable_if<T>::type
可以缩写为std::enable_if_t<T>
一样。不确定是否可能,因为在我的情况下HKT_t<SomeType>
(假设它存在)将是别名模板而不是类型。用法类似于HKT_t<SomeType><Foo>
......我猜这真的是一个“别名模板模板”。
我想这样做的原因是将它用作模板模板参数的参数。例如,
template<template <typename...> class T>
void foo() {...}
foo<HKT_t<std::vector<int>>>();
这可能吗?
答案 0 :(得分:1)
正如克里斯提到的,你最好的选择是创建一个包装函数来调用你的foo:
template <class T>
void wrapper_foo() {
foo<T::template type>();
}
//to call foo
wrapper_foo<HKT<std::vector<int>>>();
或者使用模板参数的默认值:
template<class T, template <class...> class TT = T::template type>
void foo() {
TT<float> t;
}
现在你可以简单地打电话:
foo<HKT<std::vector<int>>>();