Определение наличия внешней функции на этапе компиляции
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.04.17 04:52
Оценка:
Есть пачка отладочных функций преобразующих пользовательский тип в нечто удобочитаемое:
QString toString(const MyType &val);


Но иногда хочется получить не только представление в виде строки, а запихать всё это дело сразу в QDebug (отладочный поток вывода для Qt). Само собой, для каждой из этих MyType можно реализовать еще и
QDebug operator<<( QDebug debug, const MyTypeT &val )

который только и будет что делать – вызывать toString, но хочется сделать разом, т.е. нужен шаблон. Наивный шаблонный вариант само собой не прокатывает и нужно разрешить оператор только для тех типов, для который функция toString реализованна. Как подобное реализовать для случая если toString является членом класса который необходимо задампировать вроде всё понятно, но с внешней функцией выходит какая-то хрень, слабоват я в шаблонной магии

Так что вопроса два:
1) Как сделать?
2) Что сейчас по шаблонной магии модно читать?
Re: Определение наличия внешней функции на этапе компиляции
От: night beast СССР  
Дата: 17.04.17 05:16
Оценка: 7 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Но иногда хочется получить не только представление в виде строки, а запихать всё это дело сразу в QDebug (отладочный поток вывода для Qt). Само собой, для каждой из этих MyType можно реализовать еще и

KP>
KP>QDebug operator<<( QDebug debug, const MyTypeT &val )
KP>

KP>который только и будет что делать – вызывать toString, но хочется сделать разом, т.е. нужен шаблон. Наивный шаблонный вариант само собой не прокатывает и нужно разрешить оператор только для тех типов, для который функция toString реализованна. Как подобное реализовать для случая если toString является членом класса который необходимо задампировать вроде всё понятно, но с внешней функцией выходит какая-то хрень, слабоват я в шаблонной магии

http://rsdn.org/forum/cpp.applied/6746046
Автор: niXman
Дата: 03.04.17
Re[2]: Определение наличия внешней функции на этапе компиляции
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.04.17 06:41
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>http://rsdn.org/forum/cpp.applied/6746046
Автор: niXman
Дата: 03.04.17


Да, оно, починил. Как оказалось, всё куда проще чем казалось
Re: Определение наличия внешней функции на этапе компиляции
От: so5team https://stiffstream.com
Дата: 17.04.17 07:35
Оценка: 14 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Так что вопроса два:

KP>1) Как сделать?

Вот так можно сделать operator<<(), который будет вызываться только если для типа определена функция toString. Если таковой нет, то будет ошибка времени компиляции.
https://wandbox.org/permlink/t1n9IzCRQhVcEuNS

KP>2) Что сейчас по шаблонной магии модно читать?


Такое ощущение, что лучше всего сейчас это описывается в блогах. Из англоязычных хорошие посты на эту тему, емнип, всплывают на http://foonathan.net/ и https://arne-mertz.de/. Впрочем, все хорошие посты на эту тему обязательно всплывают на reddit/r/cpp или в G+ группе Meeting C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.