C ++: динамический доступ к свойствам класса - PullRequest
1 голос
/ 13 сентября 2010

Мне интересно, можно ли получить динамический доступ к свойству класса, не зная имени свойства, доступ к которому выполняется во время выполнения.

Чтобы дать вам лучшее понимание того, к чему я стремлюсьпри этом этот php-код должен демонстрировать то, что я хочу сделать:

<?php
$object = new object();
$property = get_name_out_of_textfile();
echo $object->$property;
?>

Я знаю, что невозможно сделать то же самое, но допустим, я получил имя атрибута в cstring std:: строка и хотите получить доступ к атрибуту, соответствующему имени.Есть ли способ сделать это?

Фон в том, что я хочу динамически загружать и сохранять данные из класса с большим количеством атрибутов.Я могу сохранить в любом формате, который я хочу, но мне нужен способ загрузить их снова без указания точного атрибута каждый раз.

Заранее благодарен за любую помощь, Робин.

Ответы [ 3 ]

5 голосов
/ 13 сентября 2010

По сути, вам нужно создать дополнительную функцию, ала:

std::string get(const std::string& field, const std::string& value_representation)
{
    std::ostringstream oss;
    if (field == "a")
        oss << a;
    else if (field == "b")
        oss << b;
    else
        throw Not_Happy("whada ya want");
    return oss.str();
}

Существует множество существующих фреймворков, например, библиотека для сериализации буста. Большинство из них включают объявление вашего класса с использованием некоторой разметки или, что еще хуже, делокализованных вторичных метаданных.

Если вам действительно нужно что-то менее инвазивное, то такие инструменты, как Gcc-XML и OpenC ++, позволяют автоматизировать генерацию этих функций (первые можно легко комбинировать с библиотеками XML, немного Python или Ruby, для простого, но низкая производительность выиграть).

Просто чтобы быть абсолютно ясным, C ++ не предоставляет никакого автоматизированного, совместимого со стандартами способа сделать это. Ни один из популярных компиляторов не предоставляет расширения для этого. В отчаянии, вы можете получить анализ собственной отладочной информации, но это определенно не рекомендуется.

2 голосов
/ 13 сентября 2010

Да, это возможно ... Python, php и т. Д. Реализованы поверх C или C ++, и они предлагают это.

Но это также очень неловко.

То, что вы запрашиваете, способность проверять тип во время выполнения, называется introspection . Это сложно реализовать, поэтому, учитывая то, как вы сформулировали свой вопрос ... пока не думайте об этом, вам нужно больше опыта.

Если вы хотите самоанализ, подумайте о другом языке, действительно.

2 голосов
/ 13 сентября 2010

Если сериализация является вашей основной задачей, взгляните на существующие решения, такие как Boost.Serialization , которая выбирает потоковый подход:

// save data to archive:
// create and open a character archive for output
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << myInstance;

// ...

// restore data from archive:
// create and open an archive for input
std::ifstream ifs("filename");
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> myInstance;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...