类型检测器“ hasNestedType”是否未编译?

时间:2018-08-03 18:20:22

标签: c++ c++14 c++17 template-meta-programming sfinae

我正在尝试创建一个告诉我类型T是否具有 成员类型typename T::X

到目前为止,我的运气受到this nice answer的启发:

#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(...)中的逗号运算符不能像我想的那样工作,如果0成功(sfinae)->使它成为T::X-> {{ 1}}]

Result

1 个答案:

答案 0 :(得分:1)

您忘记了typename

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