Как я могу заставить C предпочесть преобразование char* в string_view вместо bool?

#c #c 17 #implicit-conversion

Вопрос:

У меня есть такая простая программа, как эта:

 #include <iostream>
#include <string_view>

class C {
  public:
    void print(std::string_view v) { std::cout << "string_view: " << v << std::endl; }
    void print(bool b) { std::cout << "bool: " << b << std::endl; }
};

int main(int argc, char* argv[]) {
  C c;
  c.print("foo");
}
 

Когда я запускаю его, он печатает bool: 1

Как я могу заставить C предпочесть string_view неявное преобразование вместо bool неявного преобразования?

Комментарии:

1. вы должны добавить 3-ю перегрузку: print(const char*) она создает string_view и вызывает print() вместе с ней.

2. Да, это был всего лишь пример, моя настоящая программа имеет множество типов, и почти все в c конвертируется в bool

3. На самом деле я хочу что-то вроде «сначала попробуйте все другие неявные приведения, а затем попробуйте bool , если ничего больше не сработает».

4. Вот ссылка, которая демонстрирует некоторые методы, такие как » std::enable_if ` — foonathan.net/2015/10/overload-resolution-1

Ответ №1:

Вы можете превратить string_view перегрузку в функцию шаблона и добавить к ней ограничение, чтобы она имела более высокие предпочтения, чем bool перегрузка, когда она получает тип, в который можно преобразовать string_view .

 #include <string_view>

class C {
  public:
    template<class T>
    std::enable_if_t<std::is_convertible_v<const Tamp;, std::string_view>>
    print(const Tamp; v) { std::cout << "string_view: " << std::string_view(v) << std::endl; }
    void print(bool b) { std::cout << "bool: " << b << std::endl; }
};
 

ДЕМОНСТРАЦИЯ.

Комментарии:

1. Почему добавление ограничения дает ему более высокое предпочтение?

2. Выведенный тип T на самом деле является типом строкового литерала, поскольку неявное преобразование не требуется, он имеет более высокий приоритет. Цель enable_if состоит в том , чтобы ограничить эту функцию, чтобы она принимала только типы, в которые можно преобразовать string_view , такие как const char* или string_view .