Обнаружить существование типов - PullRequest
1 голос
/ 17 ноября 2010

SFINAE позволяет нам определить, имеет ли тип определенные элементы данных или функции-члены.Может ли он также использоваться для определения, существует ли тип вообще?Справочная информация: я хочу знать, был ли <vector> включен или нет.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Это можно сделать, хотя мне удалось заставить его работать только в 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 голосов
/ 18 ноября 2010

У меня есть одна проблема с вопросом:

Если <vector> не было включено, то как вы можете проверить, был ли введен тип в блок перевода, не зная об этом?

Вы фактически просите компилятор проверить, существует ли vector, но как вы можете спросить это, не объявляя vector в первую очередь?

Я не понимаю, как какое-либо решение могло бы работать и быть стандартнымсоответствует требованиям, но я не стандартист, поэтому может быть оговорка, о которой я не знаю.

...