Как вывести массив???

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

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. #include <iostream>
    2.  
    3. template <class T>
    4. void foo(T t)
    5. {
    6.     std::cout << typeid(t).name() << std::endl;
    7. }
    8.  
    9. int main()
    10. {
    11.     int array[3] = {0};
    12.  
    13.     std::cout << typeid(array).name() << std::endl;
    14.  
    15.     foo(array);
    16.  
    17.     return 0;
    18. }
    Хочу внутри foo знать тип элементов массива и его размер! С типом проблем нет, а вот размер не поддается дрессировке! Что делать?!

    [EDIT]

    Код (Text):
    1. #include <iostream>
    2.  
    3. typedef int int_array[10];
    4.  
    5. template <class T>
    6. struct deduce
    7. {
    8. };
    9.  
    10. template <class T, int n>
    11. struct deduce<T[n]>
    12. {
    13.     enum
    14.     {
    15.         size = n
    16.     };
    17. };
    18.  
    19. int main()
    20. {
    21.     int_array arr = {0};
    22.  
    23.     std::cout << typeid(int_array).name() << std::endl;
    24.  
    25.     int f = deduce<int_array>::size;
    26.  
    27.     return 0;
    28. }
    Так дедьюсица, но этот способ не идет -> придется заставлять юзера делать typedef :dntknw: Хотелось бы без требований и максимально компактно(
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Зачем?
     
  3. _DEN_

    _DEN_ DEN

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

    Потому что дедьюсить значения (в примере - arr) умеют только функции. Классы и структуры умеют дедьюсить только типы (в примере - int_array).

    [EDIT]

    Не, ну можно конечно попросить его написать deduce<int[10]>, но это черевато тем, что смена размера массива приведет к внесению изменений во все места, где использовалась deduce<int[10]>.
     
  4. RedLord

    RedLord Member

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

    template <class _Tp, int N>
    void foo(_Tp(& v)[N])
    {
    printf ("%d", N);
    }

    VC 6.0 - это не соберет
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    А почему не так?
    Код (Text):
    1. #include <vector>
    2. #include <iostream>
    3.  
    4. template <class T>
    5. foo (std::vector<T> v)
    6. {
    7.     std::cout<<typeid(T).name()<<"  "<<v.size();
    8. }
    9.  
    10. main ()
    11. {
    12.     std::vector<int> v(10);
    13.     foo<int>(v);
    14.     getchar();
    15. }
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    RedLord
    Да, я тоже вспомнил, что видел похожий код в strxxx_s, но не нашёл сходу.
    Кстати, а зачем там такая странная конструкция: (& v)?
     
  7. RedLord

    RedLord Member

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

    _Tp& v - вопросов не вызывает

    _Tp & v [N] - парсер не разгребет. ему нужно подсказать

    _Tp (&v) [N] - здесь (&v) в скобках, что подсказывает компилятору, что имеем дело со ссылкой
     
  8. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    IceStudent
    а как тебе эта? :)
    Код (Text):
    1. (*fpif(int))(int); // ISO C++ 8.3.5. пункт 9
     
  9. RedLord

    RedLord Member

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord
    А вектор не массив? Имхо классы и были введены чтобы решать подобные задачи, например с размером массива. А выкорячиваться пытаясь получить размер встроенного массива, IMHO по определению не верно, так как ну нету во встоенных массива такого. Ясно что такая информация не может быть получена на стадии компиляции. Остаётся только в реалтайме, а это прямая дорога к классам.
     
  11. RedLord

    RedLord Member

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

    получение размера массива актуальная задача.
    например, если есть у тебя константная ( с какими-то коэффициентами)
    таблица как ты ее будешь задавать? как набор push_back в вектор?
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord

    Зачем же push_back.

    Вообщем по использованию мало чем отличается от обычного массива, а также внутренне.
    Вектор так же оптимален, как и обычный массив. А преимущества налицо. Так что я вижу только одни плюсы от использования вектора.
     
  13. RedLord

    RedLord Member

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

    внутренне они отличаются.

    Код (Text):
    1. void foo()
    2. {
    3.  const int v[]={1,2};
    4.  std::vector<int> v1(2);
    5. }
    весь массив разместится в стеке.
    а в случае с вектором в стеке будут только мемберы вектора. а место для хранения данных будет выделено из динамической памяти.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord
    А как насчёт аллокатора?
    Я имел ввиду, что эффективность у них одинакова, а внутренняя реализация конечно отличается.

    Как-то это не ООП, и вообще очень плохо, ошибиться при передачи параметра очень легко. И конечно это искусственное решение, так как вычисляет это не компилятор.
     
  15. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Booster
    а откуда он выделяет? есть реализации аллокатора, выделяющего память со стека? с интересом посмотрю.
    вычисляет как раз компилятор :)
    Код (Text):
    1. template <class _Tp, int N>
    2. int get_sz(_Tp(& v)[N])
    3. {
    4.     return N;
    5. }
    6. void test()
    7. {
    8. int v[]={2,2}
    9. int sz = get_sz(v); // sz==2
    10. }
    явно в функцию размер массива не передается.

    это и не есть ООП.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord

    Всё сдаюсь, твоя функция рулит, невнимательно посмотрел.
    В принципе её можно выдавать из пула, но это гемор конечно.
     
  17. _DEN_

    _DEN_ DEN

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

    +10, супербизон-кросавчег!!!

    Получается, "как таковой" массив передать нельзя? Либо ссылкой, либо указателем на первый элемент?

    2 Беспосчадный даосс.

    Новое название темы - незачот. Смысл не в выводе массива, а в том, как выполнить декомпозицию типа на шаблонах.
     
  18. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    _DEN_
    в шаблонную функцию?
     
  19. _DEN_

    _DEN_ DEN

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

    Да в любую.

    PS. Я тебе в личку отписал.
     
  20. _DEN_

    _DEN_ DEN

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

    Код (Text):
    1. (*fpif(int))(int)
    Шо это такое?