Mar 30, 2011 02:36
Про проверку наличия чего-либо в данном классе с использованием SFINAE знают, наверное, все профессиональные программисты С++, а вот этот трюк встречается довольно редко (только у меня в сырцах :)
#include
// ok, no boost
template
struct equals {
enum { value = false };
};
template
struct equals {
enum { value = true };
};
// проверяем на это
struct abc {
struct abc_tag {};
};
// проверяем этим
template
class is_abc {
struct our_local_type {};
typedef our_local_type abc_tag;
// на самом деле здесь нужна еще проверка,
// что от этого типа можно наследовать
struct check : T {
typedef abc_tag type;
};
public:
enum { value = !equals::value };
};
// контрольные классы
struct ok : abc {};
struct fail {};
int main() {
using std::cout;
using std::endl;
cout << is_abc::value << endl; // 1
cout << is_abc::value << endl; // 0
system("pause");
}
[Проверено Comeau]
P.S. Отчет о поездке еще в разработке. Медитирую над System F.