Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод шаблонного типа из моего класса через cout 
V
    Опции темы
rudvil
Дата 5.11.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Есть след. класс.
Код
template <typename CharT>
class grammar_parser {
public:
  typedef typename CharT char_type;
  typedef typename std::basic_string<CharT> string_type;
};

Нужно чтобы cout принимал мои типы, а именно: char_type и string_type.
Изначально хотел, сделать у своего класса оператор <<, но как выяснилось позже это будет работать как "myClass << std::cout" что совсем не то что надо.
Нужно же вот так: "std::cout << myClass", а для этого нужно сделать std::ostream другом моего класса, вот тут я и застопорился.
Использовать "friend std::ostream& operator<< (std::ostream& o, myClass const& my);" не получится т.к. он принимает мой класс, мне же нужно чтобы он принимал только типы(char_type и string_type) моего класса.
 smile 

Если это конечно реально.

Это сообщение отредактировал(а) rudvil - 5.11.2010, 16:19
--------------------
xor
PM MAIL Skype   Вверх
cupper
Дата 5.11.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



т.е. ты хочешь переопределить оператор << для совершенно других типов/классов через свой класс ? но зачем ? Как ты представляешь себе использование такого механизма ?
PM MAIL   Вверх
rudvil
Дата 5.11.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(cupper @ 5.11.2010,  17:06)
но зачем ?

т.к. в методах часто используется std::cout с этим самим char_type, пока CharT=char все ок, но если будет другой тип который простой std::cout не поддерживает, то вот тут и начнутся проблемы.
Цитата(cupper @ 5.11.2010,  17:06)
т.е. ты хочешь переопределить оператор << для совершенно других типов/классов через свой класс ?

Почти как тут, только для моего типа char_type из шаблонного класса
Код
#include <iostream>
 
 class Fred {
 public:
   friend std::ostream& operator<< (std::ostream& o, Fred const& fred);
   ...
 private:
   int i_;    // Just for illustration
 };
 
 std::ostream& operator<< (std::ostream& o, Fred const& fred)
 {
   return o << fred.i_;
 }
 
 int main()
 {
   Fred f;
   std::cout << "My Fred object: " << f << "\n";
   ...
 }

Цитата(cupper @ 5.11.2010,  17:06)
Как ты представляешь себе использование такого механизма ?

Вот и хотелось бы узнать как, т.к. сам пока ничего путного не придумал.

Это сообщение отредактировал(а) rudvil - 5.11.2010, 17:24
--------------------
xor
PM MAIL Skype   Вверх
cupper
Дата 5.11.2010, 18:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(rudvil @ 5.11.2010,  17:19)
Почти как тут, только для моего типа char_type из 
...

Проблема в том что char_type далеко не твой тип. А тип который скрывается за CharT может быть написан хоть дядей васей из китая. И если этот дядя хороший человек то он должен был "зафрендить" operator<< ну и собсно его реализовать, или оставить сейю возможность на усмотрение тех кто его тип будет юзать. 

А переопределять оператор << для какогото не твоего типа через твой класс членом которого является этот тип... нуу по моему это както неправильно smile

PS. я кстати по соседству создал тему, главный вопрос которой как вообще правильно определить шаблонный оператор << и зафрендить его в свой шаблонный класс... это оказалось весьма не тривиальная задача.

PPS. для меня smile

Это сообщение отредактировал(а) cupper - 5.11.2010, 19:47
PM MAIL   Вверх
rudvil
Дата 5.11.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(cupper @ 5.11.2010,  18:16)
Цитата(rudvil @ 5.11.2010,  17:19)
Почти как тут, только для моего типа char_type из 
...

Проблема в том что char_type далеко не твой тип. А тип который скрывается за CharT может быть написан хоть дядей васей из китая. И если этот дядя хороший человек то он должен был "зафрендить" operator<< ну и собсно его реализовать, или оставить сейю возможность на усмотрение тех кто его тип будет юзать. 

А переопределять оператор << для какогото не твоего типа через твой класс членом которого является этот тип... нуу по моему это както неправильно smile

PS. я кстати по соседству создал тему, главный вопрос которой как вообще правильно определить шаблонный оператор << и зафрендить его в свой шаблонный класс... это оказалось весьма не тривиальная задача.

Что-ж остается надеяться что char'ы будут адаптированы под cout. smile 
Спасибо за объяснения, считаю вопрос решенным, если все-же что-то надумаю, то отпишусь.
--------------------
xor
PM MAIL Skype   Вверх
xvr
Дата 8.11.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(cupper @  5.11.2010,  18:16 Найти цитируемый пост)
Проблема в том что char_type далеко не твой тип. А тип который скрывается за CharT может быть написан хоть дядей васей из китая. И если этот дядя хороший человек то он должен был "зафрендить" operator<< ну и собсно его реализовать, или оставить сейю возможность на усмотрение тех кто его тип будет юзать. 
Более того, в рамках класса grammar_parser это (переопределение оператора <<) вообще сделать невозможно, т.к. внутри класса grammar_parser о CharT ничего не известно. 
Как, по мнению ТС, должна выглядеть реализация operator<<(CharT) ?


PM MAIL   Вверх
rudvil
Дата 8.11.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



xvr, как-то так
Код
#include <iostream>

template <typename CharT>
class grammar_parser {
public:
  typedef CharT char_type;

  grammar_parser() { }

  ~grammar_parser() { }

  void foo(int c) {
    char_type ch(c);
    std::cout << ch << std::endl;
  }

  template <typename _CharT>
  friend std::ostream & operator<<(std::ostream& os, const typename grammar_parser<_CharT>::char_type & ch);
};

template<typename _CharT>
std::ostream & operator<<(std::ostream& os, const typename grammar_parser<_CharT>::char_type& ch) {
  std::cout << "Call from char <<\n";
  os << (char)ch << std::endl;
  return os;
}

int main (int argc, char* argv[]) {
  grammar_parser<char> gp_char;
  gp_char.foo(64);
  grammar_parser<short> gp_short;
  gp_short.foo(64);
  return 0;
}


http://liveworkspace.org/code/a1d7e34b8e3f...989c36e536d4629
только почему-то не выводится текст 
Цитата
Call from char <<


Это сообщение отредактировал(а) rudvil - 8.11.2010, 14:57
--------------------
xor
PM MAIL Skype   Вверх
xvr
Дата 8.11.2010, 21:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(rudvil @  8.11.2010,  14:56 Найти цитируемый пост)
xvr, как-то так

Такая реализация предполагает, что ваш CharT это char (или приводим к char). Это слишком сильное предположение.

PM MAIL   Вверх
rudvil
Дата 8.11.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(xvr @ 8.11.2010,  21:59)
Цитата(rudvil @  8.11.2010,  14:56 Найти цитируемый пост)
xvr, как-то так

Такая реализация предполагает, что ваш CharT это char (или приводим к char). Это слишком сильное предположение.

В принципе не важно "как конвертировать", это лишь пример.
Не понятно другое - почему не вызывается "мой" оператор <<.

Это сообщение отредактировал(а) rudvil - 8.11.2010, 22:13
--------------------
xor
PM MAIL Skype   Вверх
xvr
Дата 9.11.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(rudvil @  8.11.2010,  22:12 Найти цитируемый пост)
В принципе не важно "как конвертировать", это лишь пример.
Это существенно - сам класс  grammar_parser не знает как конвертировать, поэтому не может реализовать operator<<. Нужны какие то 'внешние' знания
Цитата

Не понятно другое - почему не вызывается "мой" оператор <<.
Потому что он не отличается от обычного operator<<(ostream&.char). Ваш typename grammar_parser<_CharT>::char_type не более чем typedef, а они по определению не вводят новых типов, а лишь дают сокращенные названия старым.

Попробуйте сделать ваш operator<< не friend'ом, а static inline'ом (за работоспособность не ручаюсь, но вдруг  smile )


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.