У меня есть универсальный тип данных, который передается по значению, но не поддерживает информацию о типе. Мы храним только указатели и основные типы данных (например, int, float и т. Д.). Теперь в первый раз нам нужно сохранить std :: string внутри этого. Поэтому мы решили преобразовать его в std :: string * и сохранить его. Затем возникает проблема разрушения. Нам не нравится копировать std :: string каждый раз. Поэтому я думаю о таком подходе. Скажем, тип данных выглядит следующим образомC++ универсальный тип данных
class Atom
{
public :
enum flags
{
IS_STRING,
IS_EMPTY,
HAS_GOT_COPIED,
MARKER
};
private:
void* m_value;
std::bitset<MARKER> m_flags;
public:
.....
Atom(Atom& atm)
{
atm.m_flags.set(HAS_GOT_COPIED);
.....
}
.....
~Atom()
{
if(m_flags.test(IS_STRING) && !m_flags.test(HAS_GOT_COPIED))
{
std::string* val = static_cast<std::string*>(m_value);
delete val;
}
}
};
Это хороший подход, чтобы выяснить, нет ли больше нет ссылок на StD :: строка *? Любые комментарии ..
Я посмотрел boost :: any и poco :: DynamicAny. Поскольку мне нужна сериализация, я не могу их использовать.
Thanks, Gokul.
Вы посмотрели на boost :: variant? Как сериализация влияет на использование boost :: any? (Я никогда не пробовал poco :: DynamicAny) –
Почему не шаблон Atom на тип объекта, который он будет содержать? –
@George: Это не будет один тип данных, и это не будет служить цели. – Gokul