我正在尝试创建一个告诉我类型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}}]
答案 0 :(得分:1)
您忘记了typename
template <typename T>
struct hasX<T, decltype(typename T::X{}, 0)> : std::true_type {};
// .....................^^^^^^^^