SFINAE 2.0

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.
Previous post Next post
Up