compile time class member detection

Тема в разделе "LANGS.C", создана пользователем scf37, 29 мар 2007.

  1. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Nouzui
    мембер есть, но он не доступен. а как поступать в таком случае?
    считать, что его нет?
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RedLord
    да, собственно, неважно - для начала хотя бы отдетектить, что его нельзя использовать
    __if_exists просто говорит, что он есть, а в коде выше появляется ошибка компиляции..
     
  3. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Nouzui
    а есть в языке сущности, при выборе который сначала проверяется доступ?
    при перегрузке: сначала выбирается лучшая (если есть), а потом проверяется доступ.
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RedLord
    я, видишь ли, только сейчас об этом задумался
    а тема изначально задумывалась для того, чтобы определить, существует ли определенный метод класса для того, чтобы можно было его использовать, или следует пользоваться алтернативной реализацией
    как видишь, в общем случае задача все-таки неразрешима

    кстати, как там код? его еще кто-нибудь понимает, кроме MS?
    на MinGW я сейчас проверил, вроде нормально..
     
  5. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Nouzui
    код определяет что существует/не существует.

    а вот ответа на вопрос "существует ли определенный метод класса и он доступен" похоже нет.

    Код (Text):
    1. template <class T>
    2. char test_for_swap(const T&, member_wrapper<void (T::*)(T&), &T::swap>* p = 0);
    3.  
    4.  
    5. double test_for_swap(...);
    а так не проще?
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну типа того..
    хотя шаблон я бы оставил

    ps: тем более, _DEN_ утверждает, что это не работает но 8.0
    проверить сейчас не могу..
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nouzui

    Это не работает на 8-ке. Но как показывает жизнь, восьмерка много где косячит по сравнению с камю. На камю такой вариант как раз работает.
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    все никак не успокоюсь:

    Код (Text):
    1. #include <list>
    2. #include <iostream>
    3.  
    4. template <class T, T val>
    5. struct member_wrapper{};
    6.  
    7. template <class T>
    8. char test_for_swap(const T*, member_wrapper<void (T::*)(T&), &T::swap1>* p = 0);
    9.  
    10. template <class T>
    11. long test_for_swap(...);
    12.  
    13. template <class T>
    14. struct has_member_swap
    15. {
    16.     enum { value = (sizeof(test_for_swap<T>((const T*)NULL)) == sizeof(char)) };
    17. };
    18.  
    19. int main()
    20. {
    21.  
    22.     if(has_member_swap< std::list<int> >::value)
    23.     {
    24.         std::cout << "std:list<int>::swap is present\n";
    25.     }
    26.  
    27.     return 0;
    28. }
    minGW (2.0.0-3) несет вот такую чушь:
    SFINAE предписывает отбрасывать темплейты при несоответствии типов, или вообще при любых ошибках подстановки?
     
  9. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Nouzui
    14.8.3 Overload resolution
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ладно, я здесь плаваю, так что спорить не буду..
    просто непонятно, что в данном случае понимается под "checking":

    все, что здесь сказано, относится к сравнению типов. а как быть, если тип аргумента определить невозможно? например, при ссылке на несуществующий метод класса?
    явных указаний на этот случай я не нашел..
     
  11. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Nouzui
    похоже вот оно.
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RedLord
    ммм, похоже..
    честно говоря, я понял это так: qualified name that names a type - то есть предполагается, что "qualified name" - это typedef, и используется в шаблоне с кл. словом typename)
    и если такой тип в классе отсутствует, deduction не проходит..
    вот, собственно, пример:

    Код (Text):
    1. template <class T> int f(typename T::B*);
    2. struct A {};
    3. struct C { int B; };
    4. int i = f<A>(0);
    5. 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
    непонятно только, о каком компилере там идет речь..
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nouzui

    А я что-то не пойму почему оно должно работать без typedef :derisive: Посмотри внимательно что у тебя получается. Такое нигде не заработает.
     
  14. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    _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)
     
  15. interstron

    interstron New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    1
    Собственно, там речь идет о компиляторе interstron. Точнее, об онлайн-версии этого компилятора.
    Сам компилятор можно попробовать тут:
    http://www.interstron.ru/text.asp?id=2102