2010-11-17 50 views
1

SFINAE允许我们检测类型是否具有某些数据成员或成员函数。它是否也可用于检测是否存在类型?背景:我想知道是否包含<vector>检测类型的存在

+0

你想要编译是否包含''的代码,但做了不同的事情吗?这是邪恶的,特别是考虑到标准头文件如何相互包含在一起的实现。 – 2010-11-17 19:32:01

+3

这表明不,但我对SFINAE一点都不好:http://stackoverflow.com/questions/3600244/use-sfinae-to-test-namespace-members-existence/3600286#3600286 – 2010-11-17 19:36:07

回答

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 <vector>是肯定的?

+0

不幸的是,我的“目标受众“没有C++ 0x编译器。什么是'no_type'? – fredoverflow 2010-11-17 19:31:45

+0

@FredOverflow:对不起,它是一个空的结构。这个想法是,任何其他类型都不可能是no_type,所以无论我最终通过decltype找到哪种类型,如果替换成功,它肯定不是no_type。编辑:仍然好奇,为什么你不只是#include它。 – Puppy 2010-11-17 19:39:15

+0

@Dead:简单包括它可能是最简单/最干净的方式。仍然好奇,如果这是可能的,虽然:) – fredoverflow 2010-11-17 19:54:17

0

我有一个问题一个问题:

如果<vector>没有被列入,那么你怎么能测试是否型已在翻译单元被引入不知道呢?

您正在有效地要求编译器测试vector是否存在,但是如何在没有首先声明vector的情况下询问?

我不明白任何解决方案如何可能工作,并符合标准,但我不standardista所以可能有一个警告,我不知道。

+0

OP想知道向量是否被包含或不在首位 – Chubsdad 2010-11-18 07:43:59

+0

@Chusbad:据我所知,但C++不允许查询符号的存在(或不存在),据我所知,因为使用一个符号(即使在一个简单的'is_same'查询中),你需要它被DECLARED。如果不包括'',将如何声明'vector'? – 2010-11-20 14:37:37