嵌套模板参数和类型推导

Nested template parameters and type deduction

你好,我正在练习模板和类型推导,想尝试制作一个带有嵌套模板参数的简单函数模板来打印出任何 stl 容器的内容:

template <template<T, ALLOC> CONT> 
void Print(const CONT<T, ALLOC> &c) {

    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

我的测试用例:

int main() {
    std::list<int> intlist{ 1, 2, 3, 4, 5 };
    std::vector<float> floatvec{ 0.2f, 0.5f };

    Print(intlist);
    Print(floatvec);
}

但是,我收到一个编译器错误,无法推断出 T 和 ALLOC 的类型。有没有一种方法可以让我编写这个函数而不必显式声明模板参数的类型?

请注意,我的目标是能够推断出存储在传入的 stl 容器中的类型。因此,如果在 T 中传递了一个整数向量,将被推断为 Int 类型。

对于你的情况,你可以简单地做

template <typename CONT> 
void Print(const CONT& c) {
    for (const auto& elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

如果您想将 Print 函数限制为具有 2 个模板参数的模板 类,则语法为:

template <template<typename , typename> class CONT, typename T, typename ALLOC> 
void Print(const CONT<T, ALLOC> &c) {
    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}