Имеется много кода такого вида, используется C++17:
auto entity = get_entity();
entity->set_prop1( obj1.valueA );
entity->set_prop2( obj2.valueB );
...
entity->set_propX( objN.valueZ );
То есть тип
entity
выводится из контекста выражения. Да и
entity
этих вагон, как и мест где этот код используется.
В какой-то момент
entity
изменились сильно и теперь надо конвертировать
obj.value
иначе ошибки приведения.
Хотелось бы как-нибудь минимизировать изменения и не указывать явно типы. Я пробовал такой код:
template<typename A, typename B>A convert(B&);
...
entity->set_prop1(convert(obj.valueA));
Но ведь тип значения результата автоматически не выводится.
Еще я пробовал через указатель на метод.
magicSet(entity, &entity->set_prop1, obj.valueA);
// или
magicSet(entity, &decltype(entity)::set_prop1, obj.valueA); // выглядит не оч но можно спрятать за макросом
Но такой код тоже не компилируется.
Как неявно вывести для шаблона тип аргумента метода принимающего результат шаблонной функции?