Чтобы проверить и отобразить результат некоторых функций моей библиотеки, я создаю набор удобных функций.Перегрузка глобального оператора преобразования типа
У меня есть execute
функцию, которая выглядит как:
template <typename R, typename I>
std::string execute(const std::string& func_name, R(*func_ptr)(const I&), const I& func_input);
Это вызывает функцию, и отображать результаты и аргументы в отформатированную строку, что я могу отправить в std::cout
.
Проблема в том, что некоторые из моих функций не возвращают convertible-to-string. Я думал, что я мог бы просто перегрузить глобальный ::operator std::string
что-то вроде:
template <typename T>
operator std::string(const std::vector<T>& v);
Но GCC жалуется:
error: 'operator std::string(const std::vector<T, std::allocator<_CharT> >&)' must be a nonstatic member function
Ну, проблема, конечно, что я не могу добавить операторы-члены std::vector
, и даже для мои классы, я не хочу загрязнять их «для тестирования» операторов преобразования.
Я думаю, что я могу добавить слой косвенности и использовать функцию вместо оператора преобразования, но это не было бы более эстетичным решением. Я мог бы также перегрузить ::operator <<
за std::ostream
и использовать std::ostringstream
, но это также не самое чистое решение.
Я задавался вопросом, действительно ли глобальный оператор преобразования не перегружен, и если да, то почему.
Но многие операторы доступны как глобальный или член, почему это не один? Например, если существует глобальный и оператор-член <<, компилятор жалуется на двусмысленный вызов, он может сделать то же самое с конверсиями. – NewbiZ
Функции преобразования - это специальные функции-члены (такие как ctor, dtor, op = и copy-constructor), поскольку они участвуют в создании конверсий/объектов. См. 12.3. – dirkgently