【问题标题】:Alias template for higher-kinded types高级类型的别名模板
【发布时间】:2016-06-19 05:17:47
【问题描述】:

让我们将看起来像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&lt;SomeType&gt;::type&lt;Foo&gt; 来定义std::vector&lt;Foo&gt;

但我试图摆脱::type 部分,就像typename std::enable_if&lt;T&gt;::type 可以缩写为std::enable_if_t&lt;T&gt;。不过不确定是否可能,因为在我的情况下,HKT_t&lt;SomeType&gt;(假设它存在)将是别名模板而不是类型。用法类似于HKT_t&lt;SomeType&gt;&lt;Foo&gt;...我猜这确实是一个“别名模板模板”。

我想这样做的原因是将它用作模板模板参数的参数。例如,

template<template <typename...> class T>
void foo() {...}

foo<HKT_t<std::vector<int>>>();

这可能吗?

【问题讨论】:

  • 很遗憾X&lt;Y&gt; 不能指定模板,所以HKT_t&lt;std::vector&lt;int&gt;&gt; 不能是std::vector 的别名。

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


【解决方案1】:

正如 chris 所说,您最好的选择是创建一个包装函数来调用您的 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>>>();

【讨论】:

  • 这与我想使用的方式有点不同。你能看看我的更新吗?
  • @ZizhengTai 所以你不想让它不专业对吧?
  • 部分非专业化(或专业化,就此而言),但我知道别名模板不能部分专业化...
  • @ZizhengTai,如果您希望foo 实现保持原样,您还可以为foo 提供一个帮助器,以调用typename T 调用foo&lt;T::template type&gt;,在其中使用helper&lt;HKT&lt;std::vector&lt;int&gt;&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 2018-08-26
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多