boost::any
использует тип стирание для хранения объектов любого типа, и вы можете присвоить ему значение различных типов во время выполнения. any_cast
используется для извлечения исходного значения с правильным типом, который был сохранен в объекте any
. Например, текущий класс позволяет это сделать
Properties p("int", 42);
std::cout << boost::any_cast<int>(p.value) << '\n';
p = Properties("string", std::string("hello"));
std::cout << boost::any_cast<std::string>(p.value) << '\n';
Вы не можете просто преобразовать класс выше в шаблон и получить идентичную функциональность. Если вы это сделаете, вы сможете сохранить только один тип значения. И вы должны изменить весь struct
на шаблон, а не только на конструктор.
template<typename T>
struct Properties {
public:
Properties() {}
Properties(std::string s, T p)
: name(std::move(s)) // should use initialization list instead
, value(std::move(p)) // of assignment within the body
{}
Properties(T n)
: value(std::move(n))
{}
std::string name;
T value;
};
Однако код, который я разместил выше, теперь является незаконным.
Properties<int> p("int", 42);
std::cout << p.value << '\n';
// p = Properties<std::string>("string", std::string("hello"));
// will not compile because Properties<int> and Properties<std::string> are
// distinct types
Если эти ограничения в порядке, то модифицированное определение должно работать на вас.
Программа использует переменную: std :: vector prop; и другой пример использования BOOST - boost :: any_cast (prop [i] -> value); –
user3204803