C++ (Qt)#include <iostream>#include <list>#include <string> #include "any_visitor.h"#include <boost/any.hpp> struct to_double : public any_visitor<double, type_list<double, int, float, std::string>> /* Первый аргумент - возвращаемый тип, второй - список всех возможных типов, для хранимого в any значения. Если нужный тип не будет найден, из этого списка, будет выкинуто исключение std::bad_cast. */{ double operator()(const std::string & str) const { return std::stod(str); } template <class T> double operator()(const T & val) const { return val; }}; struct to_string : public any_visitor<std::string, type_list<double, int, float, std::string>>{ std::string operator()(const std::string & str) const { return str; } template <class T> std::string operator()(const T & val) const { return std::to_string(val); }}; int main(){ std::list<boost::any> many = {123, 3.14, 5.6f, std::string("2.71")}; double sum = 0.0; for (const auto & x : many) sum += apply_any_visitor(to_double(), x); // считаем сумму элементов std::cout << sum << std::endl; std::string str; for (const auto & x : many) str += apply_any_visitor(to_string(), x) + "; "; // Объединяем строки std::cout << str << std::endl; return 0;}
C++ (Qt)std::list<boost::any> many = {123, 3.14, 5.6f, std::string("2.71")};
C++ (Qt)double sum = 0.0; for (const auto & x : many) sum += apply_any_visitor(to_double(), x); // считаем сумму элементов
C++ (Qt)std::string str; for (const auto & x : many) str += apply_any_visitor(to_string(), x) + "; "; // Объединяем строки
C++ (Qt)type_list<double, int, float, std::string>
C++ (Qt)template < typename _Type >struct to_double_helper; template <>struct to_double_helper< double >{ static double execute ( const boost::any & value ) { return boost::any_cast< double >( value ); }}; template <>struct to_double_helper< std::string >{ static double execute ( const boost::any & value ) { return std::stod( boost::any_cast< std::string >( value ) ); }}; double to_double ( const boost::any & value ){ if ( value.type() == typeid( double ) ) return to_double_helper< double >::execute( value ); if ( value.type() == typeid( std::string ) ) return to_double_helper< std::string >::execute( value ); //... return 0;} int main(){ std::list< boost::any > many = {123, 3.14, 5.6f, std::string("2.71")}; double sum = 0.0; for ( const auto & x : many ) sum += to_double( x ); std::cout << sum << std::endl; return 0;}
C++ (Qt)typedef double ( *to_double_function )( const boost::any & ); to_double_function to_double_function_for_type ( const std::type_info & type ){ to_double_function result = to_double_function(); //... return result;} double to_double ( const boost::any & value ){ return (*to_double_function_for_type( value.type() ) )( value );}
C++ (Qt)...double to_double ( const boost::any & value ){ if ( value.type() == typeid( double ) ) return to_double_helper< double >::execute( value ); if ( value.type() == typeid( std::string ) ) return to_double_helper< std::string >::execute( value ); //... return 0;}
C++ (Qt)typedef type_list<double, int, float, std::string> default_type_list; struct to_double : public any_visitor<double, default_type_list>{ double operator()(const std::string & str) const { return std::stod(str); } template <class T> double operator()(const T & val) const { return val; }};
C++ (Qt)struct to_double_advance : public any_visitor<double, merge<std::complex<double>, default_type_list>::type>{ double operator()(const std::complex<double> & c) const { return c.real(); } template <class T> double operator()(const T & val) const { return to_double()(val); }};
C++ (Qt)std::list<boost::any> many = {123, 3.14, 5.6f, std::string("2.71"), std::complex<double>(123.4, 5.6)}; double sum = 0.0; for (const auto & x : many) sum += apply_any_visitor(to_double_advance(), x); std::cout << sum << std::endl;