Estoy usando una biblioteca C ++ ( strf ) que, en algún lugar dentro de ella, tiene el siguiente código:
namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }
template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
Ahora, quiero usar strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
en mi código. Pero si lo hago, me sale el siguiente error (con NVCC de CUDA 10.1):
error: more than one instance of overloaded function "strf::range" matches the argument list:
function template "auto strf::range(ForwardIt, ForwardIt)"
function template "auto strf::range(const Range &, const CharT *)"
argument types are: (util::constexpr_string::const_iterator, util::constexpr_string::const_iterator)
El código de la biblioteca probablemente se puede cambiar para evitar esto (por ejemplo, usando:
inline auto range(const typename std::enable_if<not std::is_pointer<typename std::remove_cv<Range>::type>::value, Range &>::type range, const CharT* sep)
para asegurarse de Range
que no sea un puntero); pero no puedo hacer ese cambio en este momento. En cambio, quiero indicar de alguna manera al compilador que realmente realmente quiero tener solo un argumento de plantilla, no uno especificado y otro deducido.
¿Puedo hacer eso?
Agradecería respuestas para C ++ 11 y C ++ 14; Las respuestas de C ++ 17 que involucran guías de deducción son menos relevantes, pero si tiene una, publíquela (para futuras versiones de NVCC ...)
Actualización: la biblioteca strf en sí misma se ha actualizado para sortear esta situación, pero la pregunta se presenta como se le preguntó.
char*
pero no es uno, ¿no es una solución?