[C++] аспект программирования

geja_03

Пусть есть 2 класса с1 и с2. Хочется создать глобальную функцию, которая получает 2 параметра: CString classname и CString methodname.
В ней надо создать объект класса, название которого classname и вызвать от него метод с названием methodname. Можно ли это реализовать и как, если да?

maggi14

возьми книжку Роджерсона по основам COM и сделай то же самое, только вместо гуида юзай строку

maggi14

а вообще, такая фигня называется рефлектинг и легко реализуется в дотнете и яве.

krishtaf

Можно, но будет много case-ов. Красивее в С++, наверно, не получится.

Flack_bfsp

Тогда уж if-ов. Как ты case-ами хочешь сравнение строк сделать?

maggi14

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

geja_03

А если покопать в сторону Assembly?
ЗЫ Это не мне надо, но все равно интересно

maggi14

ну, типа, там и будет рефлектинг. Только это уже сипипидотнет, а не сипипи

Chupa

Можно перед линковкой генерить код функции по таблицам символов в объектных файлах.

katrin2201

я видел какой то немного жутковатый, но вроде перевариваемый reflection для c++
попробуй погуглись, должно найтись

Dazik

Какая задача вообще решается? Просто интересно стало зачем так изъе***ваться?
Ну в смысле, имхо, зачастую можно и без рефлекшна обойтись...

geja_03

там просто около 300-400 классов, посему делать с if очень неприятно...

rosali

там просто около 300-400 классов, посему делать с if очень неприятно...
Надо сделать map из строки в фабрику, или вообще сразу map из пары строк в функтор.

Julie16

+1. А то понапридумывали тут яв и комов

Helga87

Круто, конечно. Но заносить эти пары в map все равно придется вручную. Так что не катит никак, слишком легко при добавлении нового класса забыть отразить это в map. А еще классы иногда удаляют и переименовывают. Повеситься можно.

Werdna

Не надо использовать RTTI, это извращение, бред и нелепость. Все, абсолютно все, можно написать нормальным способом.
Да, и еще не стоит использовать CString, это говнокласс который есть только в микрософте. Используй std::string

rosali

Не аргумент.
Надо просто вместо
 class C { ... 

везде писать
 CLASS(C) ... 

и ничего не забудешь. Рефлексия нужна не часто и там где она нужна, её вполне можно для себя сделать.

rosali

Не надо хотеть использовать RTTI
-1
Используй std::string
+1
=0

Werdna

-1
Бред, аргументируй. Мне ни разу не понадобилось, и я не могу представить где это надо

rosali

Когда в RTTI возникает необходимость (dynamic_cast в основном то использовать _стандартный_ лучше, чем городить свой. А говорить что он никогда не нужен - это глупость, из-за такого предубеждения просто неоправданно тратишь свое время, да и время тех, кто потом хочет понять то, что ты навыдумывал.
typeid неплохо помогает в отладочной печати из всяких заумных шаблонных функций.

Helga87

Бред, аргументируй. Мне ни разу не понадобилось, и я не могу представить где это надо
Сильно облегчает работу с системами автоматического тестирования xUnit.

Julie16

Ты когда-нить писал multiple dispatch?

Julie16

Угу. вот в QT придумали свой rtti, до сих пор страдают

Werdna

Я в этом не рублю, ни разу не применял RTTI, и не представляю когда он незаменим.

Julie16

multiple dispatch - грубо говоря это когда ты хочешь следующее: ( a, b, c, ... )->d. Вот здесь реально нужен RTTI.

Dasar

> Да, и еще не стоит использовать CString, это говнокласс который есть только в микрософте. Используй std::string
у std::string-а хуже с поддержкой языков
да и std::string rtl тянет за собой.

Julie16

И чем же хуже у std::string с поддержкой языков? И что такое rtl?

evgen5555

Примерно то же, что и libc

Julie16

то есть это плохо что мои программы тянут за собой libc?

evgen5555

Плохость от платформы зависит

Dazik

>там просто около 300-400 классов, посему делать с if очень неприятно...
Изначально не подразумевалось такое использование? Нет доступа к исходникам этих классов?
Кстати, ты так и не сказал, для чего тебе вообще нужно так вызывать объекты этих классы. Цель-то какая?
Спасибо.
ЗЫ
>std::string
+1

anton-alfimov

И хули тогда песдеть?

Dasar

> И чем же хуже у std::string с поддержкой языков?
тем, что locale-ы (порядок сортировки, допустимые символы, форматирование чисел и времен, преобразования между 8битами и уникодом и т.д.) надо руками настраивать

Dasar

> то есть это плохо что мои программы тянут за собой libc?
если интересует размер конечного файла, то да - плохо.

Dasar

> Да, и еще не стоит использовать CString, это говнокласс который есть только в микрософте. Используй std::string
вот такой код с последующим вызовом работает быстрее:

CString GetString
{
return "Bla-Bla";
}

чем

std::string GetString
{
return "Bla-Bla";
}

ps
В целом, у std::string лучше теоретическая база, а CString - лучше вычищено практическое применение.

Zoulla

Почему? В смысле почему быстрее?

Werdna

Бред. Бред и еще раз бред!

anton-alfimov

Песдетс у тибя аргументы

Dasar

> Почему? В смысле почему быстрее?
Потому что std::string всегда копирует строку при присваиваниях, в отличии, от CString-а.

Zoulla

Это в стандарте сказано?

Werdna

Потому что std::string всегда копирует строку при присваиваниях, в отличии, от CString-а.
Наглая ложь. Не исмпользуй кривую реализацию.

Julie16

В стандарте это не сказано. Вменяемые реализации не копируют.

Zoulla

Что значит вменяемые? У таких реализаций вроде какие-то проблемы с многопоточностью.

Julie16

а у CString'а значит их нет? И что ты имеешь ввиду под проблемами? Если незначительное падение скорости - то да, есть. Так же как очевидно и у CString.

korsar0156

http://www.garret.ru/~knizhnik/cppreflection/docs/reflect.html
Умеет выковыривать информацию о классах из отладочной информации,
это на случай если совсем уж не хочется менять исходники и есть
возможность оставить дебаг информацию в релизе.

Flack_bfsp

В стандарте это не сказано. Вменяемые реализации не копируют.
Сказано-сказано. В главе 21.3 сформулированы правила для std::string, и добавлено, что эти правила делают возможным, но не обязательным reference-counting. И дальше сказано, что реализации через счётчик должны иметь ту же семантику, что и без него. Соответственно, во всех правильных реализациях через счётчик и делается, поэтому ничего не копируется.
Оставить комментарий
Имя или ник:
Комментарий: