类型检测器`hasNestedType`未编译

type detector `hasNestedType` not compiling?

本文关键字:编译 hasNestedType 类型 检测器      更新时间:2023-10-16

我正在尝试制作一个元函数,该函数告诉我类型T是否具有成员类型CCD_ 2。

到目前为止,我的运气受到了这个好答案的启发:

#include <utility>
#include <type_traits>
struct A {using X = double;};
struct B {};
template <typename T, typename = int>
struct hasX : std::false_type {};
template <typename T>
struct hasX<T, decltype(T::X{}, 0)> : std::true_type {};

int main() 
{
static_assert(hasX<A>::value,"Should have has X");
static_assert(!hasX<B>::value,"Should NOT have X");
}

但是它没有编译,我想知道问题出在哪里?为什么decltype(...)中的逗号运算符不能像我想要的那样工作[如果T::X成功则返回0(sfinae(->使其成为int->true]

结果

您忘记了typename

template <typename T>
struct hasX<T, decltype(typename T::X{}, 0)> : std::true_type {};
// .....................^^^^^^^^