cha*_*ich 25 c++ containers templates stl
有什么方法可以制作一个函数,该函数将具有特定类型(可以说std::string
)的容器作为参数
void foo(const std::container<std::string> &cont)
{
for(std::string val: cont) {
std::cout << val << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
并为每种类型的 stl 容器调用它作为输入?像上面一样?
std::set<std::string> strset;
std::vector<std::string> strvec;
std::list<std::string> strlist;
foo(strset);
foo(strvec);
foo(strlist);
Run Code Online (Sandbox Code Playgroud)
son*_*yao 21
您可以使用容器类型foo
的模板模板参数制作函数模板。
例如
template<template<typename...> typename C>
void foo(const C<std::string> &cont)
{
for(std::string val: cont) {
std::cout << val << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
取决于您是否想foo
为其他情况超载
// Doesn't participate in overload resolution when not applicable
template<typename Container, typename = std::enable_if_t<std::is_same_v<typename Container::value_type, std::string>>>
void foo(const Container &cont) {
for(std::string val: cont) {
std::cout << val << std::endl;
}
}
// simpler
template<typename Container>
void foo(const Container &cont) {
static_assert(std::is_same_v<typename Container::value_type, std::string>, "Container must contain std::string")
for(std::string val: cont) {
std::cout << val << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用不同的测试来std::is_same
,例如std::is_convertible
允许
std::vector<char *> c_strings;
foo(c_strings);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
880 次 |
最近记录: |