No se puede pasar una plantilla como si fuera una función, por lo que ni std :: forward ni su hipotética función no std :: identity funcionarán como están (por así decirlo). Que había necesidad de establecer explícitamente el tipo de destino de la transformada:
table.SortColumnUsing(3, nonstd::identity<std::string>);
Eso parece un poco feo para mí, porque el tipo en la especialización de plantilla es una característica de la implementación interna de la mesa, en lugar de tener nada que ver con el tipo en el que espero que la tabla se serialice para fines de clasificación. O tal vez no almacene realmente las columnas como std :: string.
¿Cómo funciona atoi como un descriptor de tipo? atoi espera un char *, no un std :: string, y no creo que puedas convertir implícitamente int(const char*)
en int(const std::string&)
. Incluso si pudieras hacer eso, qué tipo usas, que puede almacenar un int(const std::string&)
y un Banana(const std string&)
. Tal vez no entiendo completamente el contexto de su pregunta, o como alternativa, tengo algunos trucos de C++ en la manga que me encantaría aprender.
Mi inclinación sería pasar una función de comparación en lugar de una función de conversión. Eso daría como resultado un único tipo de función constante, tal vez bool(const std::string&, const std::string&)
. Eso también podría hacer que sea más sencillo de implementar, por ejemplo. Comparación de cadenas insensible a mayúsculas y minúsculas para determinadas columnas, u otros hacks de clasificación convenientes para UI (como colocar carpetas en la parte superior de la lista: primero compruebe si solo una de las cadenas tiene un final /, de lo contrario use una comparación estándar). Sin embargo, eso no soluciona realmente el problema de la especialización; para el caso std::string
, aún así termina con std::less<std::string>
(que al menos existe.)
No es una gran respuesta, lo sé ... pero fue demasiado tiempo para un comentario.
Tal vez 'std :: forward' cumple esos requisitos? –
@Kerrek: Es una buena opción, aunque requiere que deletree los argumentos de la plantilla. – Xeo