如何处理嵌套模板类的成员函数实现问题?
C++嵌套模板类的Print函数适配问题
我正在深入学习C++模板,尤其是嵌套模板类的相关内容。现实现了一个Container模板类,包含数据成员、修改数据的成员函数SetData和打印内容的成员函数Print,代码如下:
#include <iostream> #include <vector> template<typename T> class Container { public: Container() :data_(0) {} void SetData(T data); void Print(); private: T data_; }; // class Container template<typename T> void Container<T>::SetData(T data) { data_ = data; } template<typename T> void Container<T>::Print() { std::cout << data_ << std::endl; }
显然,Print函数无法处理std::vector这类类型,需要特殊处理。我可以针对std::vector<int>这类特定场景编写模板全特化:
template<> void Container<std::vector<int>>::Print() { for (const int &i : data_) { std::cout << i << " "; } std::cout << std::endl; }
但这种方式需要大量重复代码才能覆盖short、long、float、double或std::complex等深层嵌套场景。因此我有两个问题:
- 针对单层嵌套场景(如
std::vector<int>),如何用模板语法处理std::vector内部的类型? - 针对深层嵌套场景(如
std::vector<std::complex<double>>)该如何处理?
我尝试过两种方法但均失败:
- 第一种是尝试重载
Print函数:
template<typename T> void Container<std::vector<T>>::Print() { for (const auto &d : data_) { std::cout << d << " "; } std::cout << std::endl; }
我理解失败原因是Container<std::vector<int>>的模板参数是std::vector<int>而非int。
- 第二种是在类内声明模板函数
PrintVector:
template<typename T> class Container { public: Container() :data_(0) {} void SetData(T data); void Print(); template<typename U> void PrintVector(); private: T data_; }; // class Container
并按如下方式实现:
template<typename T> template<typename U> void Container<std::vector<U>>::PrintVector() { for (const U &element : data_) { std::cout << element << std::endl; } }
这也失败了,我认为问题在于Container<std::vector<U>>并非Container的特化版本,可能需要对整个类进行特化。我的最后一个思路是在Print()函数内判断T的类型,分别处理std::vector、std::complex等类型。
内容的提问来源于stack exchange,提问作者msom
相关产品推荐
相关产品推荐

