Вывод параметров оператора ()

Тема в разделе "LANGS.C", создана пользователем _DEN_, 6 май 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Что-то как-то на похмельную голову не соображается)))

    Код (Text):
    1. struct st
    2. {
    3.     int operator () (float) const;
    4. };
    5.  
    6. template <class cmd, class req, class res>
    7. void deduce(cmd, res (cmd::*)(req) const = &cmd::operator ())
    8. {
    9. }
    10.  
    11. void foo()
    12. {
    13.     st obj;
    14.  
    15.     deduce(obj, &st::operator ()); // Тут все хорошо - подсказали о чем речь
    16.  
    17.     deduce(obj); // А тут никак - самостоятельно вывести не может :(
    18. }
     
  2. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Код (Text):
    1. template<class T>
    2. void f(T t = int(4)) {};
    3. int main()
    4. {
    5.     f(); //не работает
    6.     return 0;
    7. }
    Очевидно, типы не выводятся из аргументов по умолчанию. почему - надо курить стандарт, кому не лень это сделать? :)
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Не хочу создавать новую тему, но зачем нужен этот оператор? (с остальными понятно)
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    для функторов
     
  5. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Например, третий аргумент std::sort
    RTFMSDN
     
  6. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    "Очевидно", потому что этот пример "не работает" на конкретном компиляторе? По диагностике компилятора нельзя делать выводы об очевидности тех или иных конструкций.

    14.8.2.4/17
     
  7. _DEN_

    _DEN_ DEN

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

    Так все-таки задача-то решаема?
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну все, я пришел в себя и мозг снова работает)))

    Код (Text):
    1. struct st
    2. {
    3.     int operator () (float) const;
    4. };
    5.  
    6. template <class cmd, class req, class res>
    7. void deduce(cmd, res (cmd::*)(req) const)
    8. {
    9. }
    10.  
    11. template <class cmd>
    12. void deduce(cmd const& c)
    13. {
    14.     deduce(c, &cmd::operator ());
    15. }
    16.  
    17. void foo()
    18. {
    19.     st obj;
    20.  
    21.     deduce(obj);
    22. }
     
  9. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    спасибо за ссылку
     
  10. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Почему они ввели такое ограничение?
     
  11. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Мне, например, хватает того, что 'default arguments' не входят в сигнатуру функций, в отличии от 'template-parameters'. На этом поведнии завязано довольно много, в частности сначала происходит вывод типов, а затем невная конвертация значения 'default argument expression' к типу (уже!) выведенного параметра. Если это оганичение будет отсутствовать, то можно напридумывать множество примеров с неясной семантикой. Но это мое мнение, я не знаю реальной причины и состояния стандарта на момент принятия этого ограничения. Может быть оно было принято как результат работы над defect reports, может быть нет...