[C++] аспект программирования
возьми книжку Роджерсона по основам COM и сделай то же самое, только вместо гуида юзай строку
а вообще, такая фигня называется рефлектинг и легко реализуется в дотнете и яве.
Можно, но будет много case-ов. Красивее в С++, наверно, не получится.
Тогда уж if-ов. Как ты case-ами хочешь сравнение строк сделать?
а, блин, увлекся, он ведь только создать и вызвать по имени хочет, а не наоборот
ЗЫ Это не мне надо, но все равно интересно
ну, типа, там и будет рефлектинг. Только это уже сипипидотнет, а не сипипи
Можно перед линковкой генерить код функции по таблицам символов в объектных файлах.
попробуй погуглись, должно найтись
Ну в смысле, имхо, зачастую можно и без рефлекшна обойтись...
там просто около 300-400 классов, посему делать с if очень неприятно...
там просто около 300-400 классов, посему делать с if очень неприятно...Надо сделать map из строки в фабрику, или вообще сразу map из пары строк в функтор.
+1. А то понапридумывали тут яв и комов
Круто, конечно. Но заносить эти пары в map все равно придется вручную. Так что не катит никак, слишком легко при добавлении нового класса забыть отразить это в map. А еще классы иногда удаляют и переименовывают. Повеситься можно.
Да, и еще не стоит использовать CString, это говнокласс который есть только в микрософте. Используй std::string
Надо просто вместо
class C { ...
везде писать
CLASS(C) ...
и ничего не забудешь. Рефлексия нужна не часто и там где она нужна, её вполне можно для себя сделать.
Не надо хотеть использовать RTTI-1
Используй std::string+1
=0
-1Бред, аргументируй. Мне ни разу не понадобилось, и я не могу представить где это надо
typeid неплохо помогает в отладочной печати из всяких заумных шаблонных функций.
Бред, аргументируй. Мне ни разу не понадобилось, и я не могу представить где это надоСильно облегчает работу с системами автоматического тестирования xUnit.
Ты когда-нить писал multiple dispatch?
Угу. вот в QT придумали свой rtti, до сих пор страдают
Я в этом не рублю, ни разу не применял RTTI, и не представляю когда он незаменим.
multiple dispatch - грубо говоря это когда ты хочешь следующее: ( a, b, c, ... )->d. Вот здесь реально нужен RTTI.
у std::string-а хуже с поддержкой языков
да и std::string rtl тянет за собой.
И чем же хуже у std::string с поддержкой языков? И что такое rtl?
Примерно то же, что и libc
то есть это плохо что мои программы тянут за собой libc?
Плохость от платформы зависит
Изначально не подразумевалось такое использование? Нет доступа к исходникам этих классов?
Кстати, ты так и не сказал, для чего тебе вообще нужно так вызывать объекты этих классы. Цель-то какая?
Спасибо.
ЗЫ
>std::string
+1
И хули тогда песдеть?
тем, что locale-ы (порядок сортировки, допустимые символы, форматирование чисел и времен, преобразования между 8битами и уникодом и т.д.) надо руками настраивать
если интересует размер конечного файла, то да - плохо.
вот такой код с последующим вызовом работает быстрее:
CString GetString
{
return "Bla-Bla";
}
чем
std::string GetString
{
return "Bla-Bla";
}
ps
В целом, у std::string лучше теоретическая база, а CString - лучше вычищено практическое применение.
Почему? В смысле почему быстрее?
Бред. Бред и еще раз бред!
Песдетс у тибя аргументы
Потому что std::string всегда копирует строку при присваиваниях, в отличии, от CString-а.
Это в стандарте сказано?
Потому что std::string всегда копирует строку при присваиваниях, в отличии, от CString-а.Наглая ложь. Не исмпользуй кривую реализацию.
В стандарте это не сказано. Вменяемые реализации не копируют.
Что значит вменяемые? У таких реализаций вроде какие-то проблемы с многопоточностью.
а у CString'а значит их нет? И что ты имеешь ввиду под проблемами? Если незначительное падение скорости - то да, есть. Так же как очевидно и у CString.
http://www.garret.ru/~knizhnik/cppreflection/docs/reflect.html
Умеет выковыривать информацию о классах из отладочной информации,
это на случай если совсем уж не хочется менять исходники и есть
возможность оставить дебаг информацию в релизе.
Умеет выковыривать информацию о классах из отладочной информации,
это на случай если совсем уж не хочется менять исходники и есть
возможность оставить дебаг информацию в релизе.
В стандарте это не сказано. Вменяемые реализации не копируют.Сказано-сказано. В главе 21.3 сформулированы правила для std::string, и добавлено, что эти правила делают возможным, но не обязательным reference-counting. И дальше сказано, что реализации через счётчик должны иметь ту же семантику, что и без него. Соответственно, во всех правильных реализациях через счётчик и делается, поэтому ничего не копируется.
Оставить комментарий
geja_03
Пусть есть 2 класса с1 и с2. Хочется создать глобальную функцию, которая получает 2 параметра: CString classname и CString methodname.В ней надо создать объект класса, название которого classname и вызвать от него метод с названием methodname. Можно ли это реализовать и как, если да?