更高态类型的别名模板

Alias template for higher-kinded types

本文关键字:别名 高态 类型      更新时间:2023-10-16

让我们调用看起来像 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>>>();

可能吗?

正如克里斯提到的,您最好的选择是创建包装功能以调用您的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>>>();