Для проверки и отображения результатов некоторых функций моей библиотеки я создаю набор удобных функций.
У меня есть функция 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
.
Проблема в том, что некоторые из моих функций не возвращают преобразование в строку результатов. Я думал, что могу просто перегрузить глобальный ::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
, но это также не самое чистое решение.
Мне было интересно, действительно ли глобальный оператор преобразования не перегружен, и если да, то почему.