【发布时间】: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<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 不是在函数调用中“推导出”的吗?或者这不叫类型推演?
【问题讨论】:
标签: c++ templates typedef type-deduction