#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
.