C++ (Qt)struct CData { float mAmount; int mSomeVal;// .. еще 100 таких}; void SetupData( const CData & src, CData & dst, int key ){ dst = src; // копируем dst.mAmount = ??? // какие-то поля меняем}
C++ (Qt)struct CData{ float mAmount; int mSomeVal;}; enum keys{ key0, key1}; class setter{public: typedef boost::variant<int, float> variant_t; typedef int key_t; typedef std::map<key_t, std::function<void (setter*, const variant_t &)>> map_t; setter(CData & data) : m_data(data) { m_map[keys::key0] = std::function<void (setter*, const variant_t &)>(&setter::set_amount); m_map[keys::key1] = std::function<void (setter*, const variant_t &)>(&setter::set_some_val); } template <class T> void set(key_t key, const T & val, const CData & src) { m_data = src; m_map[key](this, val); } private: CData & m_data; map_t m_map; void set_amount(const variant_t & val) { m_data.mAmount = boost::get<decltype(m_data.mAmount)>(val); } void set_some_val(const variant_t & val) { m_data.mSomeVal = boost::get<decltype(m_data.mSomeVal)>(val); }}; int main(){ CData dst; CData src; setter mysetter(dst); mysetter.set(keys::key0, 12.9f, src); std::cout << dst.mAmount << std::endl; mysetter.set(keys::key1, 100500, src); std::cout << dst.mSomeVal << std::endl; return 0;}
C++ (Qt)class Mutabler{ ....private: Key m_key; // Тот самый ключ map<string, variant> m_values; // Коллекция с измененными значениями (название параметра : значение )};