написать что-то вроде такого:
template <size_t N>
size_t len(const char (&str)[N]) { return N - 1; }
size_t len(const char* str) { return strlen(str); }
И чтобы для len("test") вызывалась первая перегрузка, а для len(std::string("test").c_str()) — вторая
Но этого не происходит. Упорно вызывается вторая перегрузка для обоих случаев.
первое это lvallue &&
Тоже стало интересно... Ведь если передать литерал, то получается точное совпадение с шаблоном функции....
Можно добавить приоритезацию тегами
А если сделать вот так, то неопределенность, но, вроде как, первая перегрузка должная явно выигрывать...
А можно развернуть мысль или примерчик, а то пока непонятно
https://godbolt.org/z/xPnWEG6r7 Это общая идея тегов. Но в данной задаче это кажется лишним, возможно стоит обойтись одним шаблоном с if constexpr
разрешить перегрузку лишь на основе того, что одна принимает массив, а другая — указатель, нельзя. http://eel.is/c++draft/dcl.fct#5 обычная функция однозначно выигрывает у шаблонной при разрешении перегрузки http://eel.is/c++draft/over.match.best#general-2.4 из вариантов, которые еще не звучали, могу предложить пользовательский строковый литерал https://en.cppreference.com/w/cpp/language/user_literal
Это работает Очень круто, спасибо!
За ссылку на стандарт тоже спасибо, теперь понятно почему в моем примере постоянно выигрывала перегрузка с const char*
Обсуждают сегодня