更高级别类型的别名模板

时间:2016-06-19 05:17:48

标签: c++ c++11 c++14

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

这可能吗?

1 个答案:

答案 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>>>();