【发布时间】:2018-08-03 18:20:21
【问题描述】:
我正在尝试制作一个元函数,它告诉我 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(...) 中的逗号运算符不能像我想要的那样工作[如果T::X 成功(sfinae)返回0 -> 使其成为int -> true] p>
【问题讨论】:
-
专业提示:如果您不想依赖
X作为默认构造,可以将typename = int替换为typename = void,将decltype(typename T::X{}, 0)替换为std::void_t<typename T::X>。跨度> -
@HolyBlackCat 完美,谢谢:-)!
标签: c++ c++14 c++17 template-meta-programming sfinae