如何使用概念检查类型中是否存在类型别名

4
有没有办法要求一个给定的类型在其中定义一个类型别名?例如,我如何编写一个概念来检查这是否有效,其中概念检查类型 T 是否有一个类型别名 "Bar"?
template <typename T>
concept HasBarType = ????;

template <HasBarType T>
void foo() {
    [[maybe_unused]] T::Bar bar;
}
1个回答

5
template <typename T>
concept HasBarType = requires { typename T::Bar; };

这个检查确保T::Bar是一个类型。它可以是T中的类型别名,也可以是T中的嵌套类,T的基类,或者是T本身的注入类名。
开头的typename关键字使其成为一个类型要求,其语义与没有typename或者用额外的大括号的同一行有所不同。
使用typename要求T::Bar是一个类型。
不使用typename时,它是一个简单要求,要求T::Bar是一个格式正确的表达式。
使用额外的大括号,可选地跟着-> type-constraint,它是一个复合要求,要求表达式typename T::Bar是格式正确的,并且表达式的结果类型满足指定的类型约束。(这是不可能的,因为typename T::Bar没有一个有效的表达式形式。)
在非静态数据成员中,你还需要在T::Bar之前加上typename,因为T::Bar是依赖的。

啊,我明白我错在哪了。我大部分都对,只是在requires子句中多了一对括号。你为什么需要 requires { { something }; }; 而不是你写的那样呢?这只是为了验证表达式的输出是否符合概念吗?例如,这里找到的 Hashable 概念有嵌套的括号。 - undefined
1
@Keltek 这是完全不同类型的“要求”。请看我的编辑。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接