Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Вывести тип, использованный в шаблонных параметрах аргумента

#cpp #шаблоны_с++ #cpp17


Можно ли сделать так, чтобы тип CharT выводился автоматически в C++17?

template
void test(std::basic_string_view string) {

}
test("hello world"); //ok
test("hello world"); //compile error

    


Ответы

Ответ 1



Можно добавить перегрузку: template void test(CharT const ( & string )[x_array_size]) { return test(std::basic_string_view{string}); }

Ответ 2



Сразу создавать basic_string_view через пользовательский литерал using namespace std::string_view_literals; test("hello world"sv);

Ответ 3



Присвойте тип по умолчанию: template void test(std::basic_string_view string) Тогда если вы явно не укажете тип для шаблонной функции, будет использован char по умолчанию

Ответ 4



Извините, но мне не совсем понятно, зачем Вам это нужно. Вам не нужен никакой вывод типов для того случая, который Вы описали: test("hello world"); //ok test("hello world"); //compile error Функция, которая в качестве параметра принимает std::string_view прекрасно справится и с std::string, и с C-string: void print_str_view(std::string_view str_view) { std::cout << str_view << std::endl; } const char* str0 = "C-string"; std::string str1 = "std::string"; print_str_view("string"); print_str_view(str0); print_str_view(str1); А вот если Вы передадите в качестве аргумента std::wstring - код не скомпилируется. Эту проблему решит перегрузка вышеуказонной ф-ии функцией: void print_str_view(std::wstring_view str_view) { std::wcout << str_view << std::endl; } Пример: std::wstring str2 = L"légo"; print_str_view(str2);

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

Отправить комментарий