让我们调用一个看起来像T<Us...>一个更高级的类型的类型.对于某种更高级的类型SomeType(让我们说它是std::vector<int>),我想使用类型特征从中提取Tpart(std::vector).我可以这样做:
template<typename>
struct HKT;
template<template <typename...> class T, typename... Us>
struct HKT<T<Us...>> {
template<typename... Vs>
using type = T<Vs...>;
};
Run Code Online (Sandbox Code Playgroud)
所以现在我可以做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>>>();
Run Code Online (Sandbox Code Playgroud)
那可能吗?
正如 chris 提到的,最好的选择是创建一个包装函数来调用 foo:
template <class T>
void wrapper_foo() {
foo<T::template type>();
}
//to call foo
wrapper_foo<HKT<std::vector<int>>>();
Run Code Online (Sandbox Code Playgroud)
或者使用模板参数的默认值:
template<class T, template <class...> class TT = T::template type>
void foo() {
TT<float> t;
}
Run Code Online (Sandbox Code Playgroud)
现在你可以简单地调用:
foo<HKT<std::vector<int>>>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |