【发布时间】:2017-08-29 22:05:28
【问题描述】:
当每个类模板特化仅在涉及非推导上下文中的模板参数的模式之间是不同的时,多个类模板特化是否有效?
std::void_t 的一个常见示例使用它来定义一个特征,该特征揭示一个类型是否有一个名为“type”的成员 typedef。在这里,采用了单一的专业化。这可以扩展来识别一个类型是否有或者一个名为“type1”的成员typedef,或者一个名为“type2”的成员。下面的 C++1z 代码使用 GCC 编译,但不是 Clang。合法吗?
template <class, class = std::void_t<>>
struct has_members : std::false_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type1>> : std::true_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type2>> : std::true_type {};
【问题讨论】:
-
暂时看不出有什么问题。 clang 的错误信息到底是什么意思?
-
对于同时具有
type1和type2的类不合适吗? -
离题了,但是写
bool_constant<true>而不是更短的true_type很奇怪(false也是如此) -
这取决于
using何时必须被理解——何时声明,或者何时发生模板替换。当声明发生时,Clang 正在摸索它(似乎很明显这就是它正在做的事情)。这对我来说显然是错误的。我认为 clang 是错误的,在这里。
标签: c++ c++17 template-specialization sfinae partial-specialization