【问题标题】:type detector `hasNestedType` not compiling? [duplicate]类型检测器`hasNestedType`没有编译? [复制]
【发布时间】: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>

Result

【问题讨论】:

  • 专业提示:如果您不想依赖X 作为默认构造,可以将typename = int 替换为typename = void,将decltype(typename T::X{}, 0) 替换为std::void_t&lt;typename T::X&gt;。跨度>
  • @HolyBlackCat 完美,谢谢:-)!

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


【解决方案1】:

你忘记了typename

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

【讨论】:

  • 啊多么愚蠢,谢谢!编译器错误消息...应该会变得更好
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2013-04-17
  • 2015-06-10
相关资源
最近更新 更多