gpt4 book ai didi

c++ - 类型别名和模板模板参数推导

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:16 24 4
gpt4 key购买 nike

问题:

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

示例:

我们将使用 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<Alias<int>>==false .然而Alias可以用作模板模板参数,例如:

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

然后ApplyInt<Alias>工作正常。

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

可能的出路:

1.更改推导规则,将类型别名检测为模板模板参数。这将使Matched<Alias>==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<Alias>{}) .不是 Alias在函数调用中“推导”?或者这不叫类型推导?

最佳答案

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

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

When a template-id refers to the specialization of an alias template, it is equivalent to the associated type obtained by substitution of its template-arguments for the template-parameters in the type-id of the alias template. [ Note: An alias template name is never deduced. — end note ]

上面的意思是,当你写 Matched<Alias<int>> , 自 Alias<int>引用别名模板的特化,相当于直接Matched<std::tuple<int,int>> .很明显为什么它与专用变量模板不匹配。

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

关于c++ - 类型别名和模板模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com