Para probar y mostrar el resultado de algunas funciones de mi biblioteca, estoy creando un conjunto de funciones útiles.Sobrecarga del operador de conversión de tipo global
que tienen una función execute
que se parece a:
template <typename R, typename I>
std::string execute(const std::string& func_name, R(*func_ptr)(const I&), const I& func_input);
Se llama a la función, y mostrar los resultados y argumentos en una cadena con formato que pueda enviar a std::cout
.
El problema es que algunas de mis funciones no devuelven convertibles a cadena resultados. Pensé que simplemente podría sobrecargar el mundial ::operator std::string
con algo como:
template <typename T>
operator std::string(const std::vector<T>& v);
Pero GCC se queja:
error: 'operator std::string(const std::vector<T, std::allocator<_CharT> >&)' must be a nonstatic member function
Bueno, el problema, por supuesto, es que no puedo añadir operadores miembros de std::vector
, e incluso para mis clases, no quiero contaminarlas con "para probar" operadores de conversión.
Supongo que puedo agregar una capa de direccionamiento indirecto y utilizar una función en lugar de un operador de conversión, pero esa no sería la solución más estética. También podría sobrecargar ::operator <<
para std::ostream
y usar un std::ostringstream
, pero esa tampoco es la solución más limpia.
Me pregunto si el operador de conversión global realmente no se puede descargar, y si es así, por qué.
Sin embargo, muchos operadores están disponibles como miembro de global o, por qué no ésta? Por ejemplo, si hay un operador global y miembro <<, el compilador se queja por una llamada ambigua, podría hacer lo mismo con las conversiones. – NewbiZ
Las funciones de conversión son funciones especiales de los miembros (como son ctor, dtor, op = y copy-constructor) ya que participan en la creación de conversiones/objetos. Ver 12.3. – dirkgently