高级类型的别名模板

Ziz*_*Tai 5 c++ c++11 c++14

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

那可能吗?

W.F*_*.F. 1

正如 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)

  • @ZizhengTai,如果您希望“foo”实现保持原样,您还可以为“foo”提供一个助手,该助手采用“typename T”来调用“foo&lt;T::template type&gt;”,其中您使用“helper&lt;HKT” &lt;std::vector&lt;int&gt;&gt;`。 (2认同)