【问题标题】:Type aliases and template template argument deduction类型别名和模板模板参数推导
【发布时间】:2018-08-26 23:20:52
【问题描述】:

问题:

我注意到在使用类型别名时模板模板推导过程中存在一些不一致。特别是类型别名可以用作模板模板参数,但不能推导出为一个。

示例:

我们将使用Matched<Type> 来查看Type 是否是模板类型的实例。

template <typename T>
bool Matched = false;

template <template <typename> typename F, typename T>
bool Matched<F<T>> = true;

现在定义一个类型别名

template<typename T>
using Alias = std::tuple<T,T>;

我的问题是Matched&lt;Alias&lt;int&gt;&gt;==false。但是Alias 可以用作模板模板参数,例如:

template<template<typename> typename F>
using ApplyInt = F<int>;

然后ApplyInt&lt;Alias&gt; 工作正常。

回顾一下,在ApplyInt&lt;Alias&gt; 中被视为模板模板参数,但在Matched&lt;Alias&lt;int&gt;&gt; 中不被视为。我觉得这有点愚蠢,因为我认为类型别名是类型上的函数,我想使用它们。目前,与类型相比,类型别名被视为二等公民,这使得很难以通用方式使用它们,例如组合或转换它们。

可能的出路:

1.更改推导规则,使类型别名被检测为模板模板参数。这将使Matched&lt;Alias&gt;==true

2.允许在模板声明中使用using,如下所示:

template<template<typename> using T, typename T>
bool Matched<F<T>> = true;

问题:

这种行为是故意的吗?这是疏忽吗?是否注意到这一点,是否会在未来的 c++ 版本中修复?


附带说明:变量模板也存在类似问题。为什么我们不能写?

template <template<typename> auto Var>
auto VarForInt = Var<int>;

编辑(接受答案后):

我真的对类型推导感到困惑。当我们在帮助类中存储类型别名时

template<template<typename> typename F>
struct Helper{};

我们有一个函数

template<template<typename> typename F>
void foo(Helper<F>){}

我们可以拨打foo(Helper&lt;Alias&gt;{})Alias 不是在函数调用中“推导出”的吗?或者这不叫类型推演?

【问题讨论】:

    标签: c++ templates typedef type-deduction


    【解决方案1】:

    是的,这是故意的。正如您所说,别名模板确实有点像“二等公民”。首先,别名模板不能专门化,这是一个真正的重要提示。

    现在,在您的示例中,他们的“低年级”完全是关于 [temp.alias]/2

    template-id 指代别名的特化时 模板,就相当于得到的关联类型 用 template-arguments 替换 template-parameters 在别名模板的 type-id 中。 [ 注:别名模板名称 永远不会被推断出来。 — 尾注 ]

    上面的意思是,当你写Matched&lt;Alias&lt;int&gt;&gt;时,由于Alias&lt;int&gt;指的是别名模板的特化,它相当于直接Matched&lt;std::tuple&lt;int,int&gt;&gt;。很明显为什么它与专用变量模板不匹配。

    这不是疏忽,也不会被修复。别名模板可以为更复杂的模板表达式提供简写。而且您不希望调用错误的重载,或实例化错误的模板特化,因为您使用的是简写而不是整个复杂表达式。

    【讨论】:

    • 非常感谢。因此,我必须稍微改变一下我对类型别名的看法。
    • 我仍然对某些事情感到困惑。在特殊情况下,我可以推断出类型别名,请参阅问题末尾的编辑。发生了什么事?
    • @tom - 如果您还有其他问题,请直接发布(如果您愿意,还可以链接回这个问题)。事后扩大问题的范围有点不礼貌。
    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多