Предположим, что у вас есть объект boost::any
и объект boost::variant
.Общая функция для конвертирования boost :: any to boost :: variant
Я ищу универсальную функцию convert
, которая принимает параметр шаблона T, являющийся специализированным boost::variant
, например. boost::variant<int, std::string>
и магически преобразует boost::any
в один из доступных типов данных boost::variant
.
template<T>
T convert(const boost::any& any) {
// Some generic conversion code here or throw exception if conversion is not possible!
}
int main(int argc, char** args) {
typedef boost::variant<int, std::string> TVar;
boost::any any="Hello World";
TVar variant=convert<TVar>(any);
// variant contains "Hello World"
return 0;
}
Мне интересно, можно ли написать такую функцию или если это может быть невозможно по какой-то причине?
Что-то вроде 'return any_cast (& any)'? Вы должны поймать исключения, и в таком случае вы можете вернуть построенный по умолчанию 'T' или что-то еще, но это то, что вы хотите? –
skypjack
Дело в том, что метод convert не должен знать заранее, какой именно boost :: variant <....> он получит. Следовательно, вы не можете реализовать преобразование, используя цепочку ifs, содержащую 'any_cast (& any)'. –
Aleph0