2010-11-17 82 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