具有特定类型作为泛型参数的 STL 容器

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)

居住

  • @theWiseBro 正是如此。OP 说它应该适用于_一个特定类型_。因此,进一步概括它没有任何好处。 (3认同)

Cal*_*eth 6

取决于您是否想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)