接受任何 STL 容器的函数

Yan*_*oze 2 c++ templates

我需要实现一个接受任何 STL 容器的模板函数。并基于什么样的容器来执行某些操作。

例子:

template <class Container, class T>
void func(Container<T> container) {
    if (container == std::map) {
        ...
    } else {
        ... 
    }
}


int main() {
    std::vector<int> v1; 
    func(v1); // ok
    std::vector<double> v2;
    func(v2); // ok
    std::map<int, double> m1;
    func(m1); // ok
    std::list<int> l1;
    func(l1); // ok
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

您可以应用Constexpr If (C++17 起) (with std::is_same) 在编译时检查类型,并应用参数包(C++11 起),因为这些容器采用多个模板参数。例如

template <template <typename...> class Container, class... T>
void func(const Container<T...>& container) {
    if constexpr (std::is_same_v<Container<T...>, std::map<T...>>) {
        ...
    } else if constexpr (std::is_same_v<Container<T...>, std::vector<T...>>) {
        ...
    } else if constexpr (std::is_same_v<Container<T...>, std::list<T...>>) {
        ...
    } else {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:这取决于您的意图,但将参数更改为 pass-by-reference-to-const 以避免不必要的复制可能是一个好主意。