【问题标题】:Detect the existence of types检测类型的存在
【发布时间】:2010-11-17 19:18:45
【问题描述】:

SFINAE 允许我们检测一个类型是否具有某些数据成员或成员函数。它也可以用来检测一个类型是否存在吗?背景:我想知道<vector>是否被收录。

【问题讨论】:

  • 无论是否包含<vector>,您都想要编译代码,但做不同的事情?这是邪恶的,特别是考虑到标准头如何相互包含取决于实现。
  • 这表明不,但我对 SFINAE 一点也不擅长:stackoverflow.com/questions/3600244/…

标签: c++ metaprogramming sfinae


【解决方案1】:

它可以做到,虽然我只设法使它在 C++0x 中工作。

struct no_type {};
struct is_vector_included {
    template<typename U> static decltype(std::vector<U>::iterator()) func( U* );
    template<typename U> static no_type func( ... );
    static const bool value = !std::is_same<no_type, decltype(func<int>(nullptr))>::value;
};

结构非常奇怪,虽然应该有一些明显的简化,但它们不起作用。更重要的是,你为什么不直接#include &lt;vector&gt; 确定一下?

【讨论】:

  • 不幸的是,我的“目标受众”没有 C++0x 编译器。 no_type 是什么?
  • @FredOverflow:对不起-这是一个空结构。这个想法是任何其他类型都不可能是no_type,所以无论我最终通过decltype找到什么类型,如果替换成功,它肯定不是no_type。编辑:仍然好奇为什么你不只是#include它。
  • @Dead:简单地包含它可能是最简单/最干净的方式。不过,仍然很好奇这是否可能:)
  • @UncleBens:我让它在 MSVC10 上运行。不过,它一下子就坏了,所以如果你有一些非常相似但不完全一样的东西,那么它就行不通了。
  • 会不会是 MSVC 编译它,因为它(仍然)没有实现模板的两阶段编译? - 如果不包含向量,则任何 U 都会失败。如果错误不依赖于 U,是否会是 substitution 失败?
【解决方案2】:

我有一个问题:

如果不包含&lt;vector&gt;,那么如何在不知道的情况下测试翻译单元中是否引入了类型?

您实际上是在要求编译器测试vector 是否存在,但是如果不首先声明vector,您怎么能这样问呢?

我看不出任何解决方案如何工作并符合标准,但我不是标准主义者,所以可能有一个我不知道的警告。

【讨论】:

  • OP首先想知道是否包含向量
  • @Chusbad: 我明白这一点,但据我所知,C++ 不允许查询符号的存在(或不存在),因为要使用符号(即使在简单的 @ 987654324@ 查询)您需要声明它。如果不包含&lt;vector&gt;,如何声明vector
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2011-07-14
  • 2022-08-05
相关资源
最近更新 更多