Существует 2 трудности: const char*
против std::string
(или даже std::string_view
в C ++ 17)
и коллекция указанного выше типа.
как Container<const char*>
, Container<std::string>
и Container<std::string_view>
- это разные типы, которые требуют преобразования для перехода от одного к другому.
Чтобы избежать этих трудностей, вы можете использовать шаблон:
template <typename StringContainer>
void function3(const StringContainer& keywords) {
for(const auto& keyword : keywords) {
std::cout << keyword << std::endl;
}
}
, но вы затем нельзя использовать
function3({ "hello", "world", "!" });
, поскольку {/*..*/}
не имеет типа. Он может соответствовать шаблону C -array или initializer_list
.
Таким образом, вы можете добавить дополнительную перегрузку для обработки этого случая:
template <typename String>
void function3(std::initializer_list<String> keywords) {
return function3<std::initializer_list<String>>(keywords);
}
и для обработки пустых initializer_list
, или аргумент по умолчанию, вы можете сделать:
template <typename String = std::string>
void function3(std::initializer_list<String> keywords = {}) {
return function3<std::initializer_list<String>>(keywords);
}
Демо