RedLord да, собственно, неважно - для начала хотя бы отдетектить, что его нельзя использовать __if_exists просто говорит, что он есть, а в коде выше появляется ошибка компиляции..
Nouzui а есть в языке сущности, при выборе который сначала проверяется доступ? при перегрузке: сначала выбирается лучшая (если есть), а потом проверяется доступ.
RedLord я, видишь ли, только сейчас об этом задумался а тема изначально задумывалась для того, чтобы определить, существует ли определенный метод класса для того, чтобы можно было его использовать, или следует пользоваться алтернативной реализацией как видишь, в общем случае задача все-таки неразрешима кстати, как там код? его еще кто-нибудь понимает, кроме MS? на MinGW я сейчас проверил, вроде нормально..
Nouzui код определяет что существует/не существует. а вот ответа на вопрос "существует ли определенный метод класса и он доступен" похоже нет. Код (Text): template <class T> char test_for_swap(const T&, member_wrapper<void (T::*)(T&), &T::swap>* p = 0); double test_for_swap(...); а так не проще?
ну типа того.. хотя шаблон я бы оставил ps: тем более, _DEN_ утверждает, что это не работает но 8.0 проверить сейчас не могу..
Nouzui Это не работает на 8-ке. Но как показывает жизнь, восьмерка много где косячит по сравнению с камю. На камю такой вариант как раз работает.
все никак не успокоюсь: Код (Text): #include <list> #include <iostream> template <class T, T val> struct member_wrapper{}; template <class T> char test_for_swap(const T*, member_wrapper<void (T::*)(T&), &T::swap1>* p = 0); template <class T> long test_for_swap(...); template <class T> struct has_member_swap { enum { value = (sizeof(test_for_swap<T>((const T*)NULL)) == sizeof(char)) }; }; int main() { if(has_member_swap< std::list<int> >::value) { std::cout << "std:list<int>::swap is present\n"; } return 0; } minGW (2.0.0-3) несет вот такую чушь: SFINAE предписывает отбрасывать темплейты при несоответствии типов, или вообще при любых ошибках подстановки?
ладно, я здесь плаваю, так что спорить не буду.. просто непонятно, что в данном случае понимается под "checking": все, что здесь сказано, относится к сравнению типов. а как быть, если тип аргумента определить невозможно? например, при ссылке на несуществующий метод класса? явных указаний на этот случай я не нашел..
RedLord ммм, похоже.. честно говоря, я понял это так: qualified name that names a type - то есть предполагается, что "qualified name" - это typedef, и используется в шаблоне с кл. словом typename) и если такой тип в классе отсутствует, deduction не проходит.. вот, собственно, пример: Код (Text): template <class T> int f(typename T::B*); struct A {}; struct C { int B; }; int i = f<A>(0); int j = f<C>(0); я из него ничего не понял, кроме того, что int B не очень похоже на typedef )) тем не менее, 7.1 упорно отказывается что-либо скомпилить: начинает получаться, только если убрать инстанцирование для A и добавить typedef перед int B в классе C и с gcc то же самое вобщем, я больше не заморачиваюсь ps: да, еще в тему - http://www.interstron.ru/messages.asp?forum_id=2186&theme_id=2254 непонятно только, о каком компилере там идет речь..
Nouzui А я что-то не пойму почему оно должно работать без typedef Посмотри внимательно что у тебя получается. Такое нигде не заработает.
_DEN_ Это экземпл к "Attempting to use a type in the qualifier portion of a qualified name that names a type when that type does not contain the specified member, or if the specified member is not a type where a type is required." (14.8.2 из 2003)
Собственно, там речь идет о компиляторе interstron. Точнее, об онлайн-версии этого компилятора. Сам компилятор можно попробовать тут: http://www.interstron.ru/text.asp?id=2102