Шаблонные функции

Тема в разделе "LANGS.C", создана пользователем cupuyc, 22 дек 2010.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Здравствуйте. Я хочу создать 2 функции с одинаковым именем, но одна должна работать с указателями, другая с обычными данными:

    Код (Text):
    1. template <typename t>
    2. int func(t const& value)
    3. {
    4.   return 1;
    5. }
    6.  
    7. template <typename t>
    8. int func(t const* value)
    9. {
    10.   return 2;
    11. }
    Но такой код всегда вызывает первую функцию..

    Код (Text):
    1. void main()
    2. {
    3.   int res = func(n); // res = 1
    4.   res = func(&n); // res = 1
    5. }
    Как быть?
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. template <typename t>
    2. int func(t const value)
    3. {
    4.   return 1;
    5. }
    6.  
    7. template <typename t>
    8. int func(t const* value)
    9. {
    10.   return 2;
    11. }
    что то мне подсказывает что то что написал ты не прокатит. может так. по сути что & что * передаются как ссылки.
     
  3. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Нужно или
    Код (Text):
    1. template <typename t>
    2. int func(t * value)
    3. {
    4.   return 2;
    5. }
    или

    Код (Text):
    1. const int n = 0;
    2. int res = func(n); // res = 1
    3. res = func(&n); // res = 1
     
  4. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    template <typename t>
    int func(const t& value)
    {
    return 1;
    }

    template <typename t>
    int func(const t * value)
    {
    return 2;
    }
    int res = func<int>(n); // res = 1
    res = func<int>(&n); // res = 1
     
  5. RedLord

    RedLord Member

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

    added:

    template <typename t>
    int func(t* value)
    {
    return 2;
    }

    не заметил пост с решением Velheart
     
  6. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Использовать перегруженные функции?
     
  7. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Спасибо. Заработало, вот только не понятна суть проблемы. Кто-нибудь может объяснить?
     
  8. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Ещё такой вопрос. Можно как-то различить простые типы (int, char, short, unsigned int, float, double и т.п) с классами и структурами? Я хочу написать несколько реализаций одной функции, типа
    Код (Text):
    1. template <typename t>
    2. int func(t const& value)
    3. {
    4.   // если t - класс или структура, то
    5.   return value.method();
    6.  
    7.   // если t - целочисленный тип или вещественный, то
    8.   return 1;
    9. }
    10.  
    11. template <typename t>
    12. int func(t* value)
    13. {
    14.   // если t - класс или структура, то
    15.   return value->method();
    16.  
    17.   // если t - целочисленный тип или вещественный, то
    18.   return 2;
    19. }
     
  9. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Вот так можно с бустом:

    http://codepad.org/yMqTCMvp
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    2010 студия на код в нулевом посте выдаёт:
    Код (Text):
    1. const int n = 0;
    2. int res = func(n); // res = 1
    3. res = func(&n); // res = 2
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    С помощью всего доступного арсенала(характеристик, перегрузки, специализации). У Александреску описано, в loki реализовано.
     
  12. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Да, я там неправильно написал. Если писать без конста
    Код (Text):
    1. int n = 0;
    то
    Код (Text):
    1. int res = func(n); // res = 1
    2. res = func(&n); // res = 1
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ну так это другое дело, смотрите:
    Код (Text):
    1. #include <iostream>
    2.  
    3. template <typename t>
    4. int func(t const& value)
    5. {
    6.     std::cout<<typeid(t).name()<<std::endl;
    7.     return 1;
    8. }
    9.  
    10. template <typename t>
    11. int func(t const* value)
    12. {
    13.     std::cout<<typeid(t).name()<<std::endl;
    14.     return 2;
    15. }
    16.  
    17. void main()
    18. {
    19.     int n = 0;
    20.     int res = func(n); // res = 1
    21.     res = func(&n); // res = 1
    22. }
    В данном случае у компилятора есть выбор между указателем на константу и ссылкой на константный указатель и он делает выбор в пользу второго, что по-моему вполне логично.

    З.Ы. Хотя это скорее логично со стороны компилятора, а не человека. Но такова природа C++. ^)
     
  14. ant_man

    ant_man New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    23
    cupuyc
    для каждого простого типа перегрузить функцию, шаблон для всего остального. Или наоборот, смотря каких типов будет больше.
     
  15. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    ant_man, вот этим гемором я и не хотел заниматься - писать с десяток реализаций. Я сделал is_ariphmetic и написал 2 реализации шаблонного класса: один для is_ariphmetic<> = false, другой - для true. Хотя, тоже не совсем изящно получилось. Лучше, конечно, если бы существовала возможность частичной инициализации шаблонных функций.
     
  16. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    cupuyc
    Код (Text):
    1. template <typename t>
    2. int func(t const& value, std::false_type)
    3. {
    4.   return 1;
    5. }
    6.  
    7. template <typename t>
    8. int func(t const* value, std::true_type)
    9. {
    10.   return 2;
    11. }
    12.  
    13. template <typename t>
    14. int func(t value)
    15. {
    16.     return func(value, std::is_pointer<t>());
    17. }