С C ++ 20 вы можете сделать:
void f(std::same_as<std::string> auto const& s);
С C ++ 17 это эквивалентно:
template <typename T,
std::enable_if_t<std::is_same_v<T, std::string>, int> = 0>
void f(T const& s);
То есть мы должны вывести T
должно быть точно std::string
(какие строковые литералы или другие char
указатели явно не являются).
Обратите внимание, что это отклоняет такие типы, как:
struct D : std::string { };
, которые также не требуют преобразования. Если вы хотите разрешить это, это меняет концепцию на std::derived_from
или enable_if
для использования std::is_convertible_v<T*, std::string*>
.