我正在读这本书C++模板:Addison Wesley的完整指南,并且有关于类模板专业化的问题。我明白它是如何工作的,但我很难理解何时使用这个特性。下面是一个Stack类的一般定义:模板专业化
#include <vector>
#include <stdexcept>
template <typename T>
class Stack {
private:
std::vector<T> elems; // elements
public:
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const { // return whether the stack is empty
return elems.empty();
}
};
这里是专业化
#include <deque>
#include <string>
#include <stdexcept>
#include "stack1.hpp"
template<>
class Stack<std::string> {
private:
std::deque<std::string> elems; // elements
public:
void push(std::string const&); // push element
void pop(); // pop element
std::string top() const; // return top element
bool empty() const { // return whether the stack is empty
return elems.empty();
}
};
我这个问题是,它似乎打破关于封装OOP原则。客户端是否需要知道有两个定义,可能在不同的头文件中,然后根据赋予Stack类的T类知道要包含哪一个?在我看来,在这种情况下你只需要实现两个不同的类,一个通用的Stack类和一个专门的StackString类。
想法?
通常你会在同一个标题中包含专业化。用户不需要知道他们正在使用专业化。 – juanchopanza 2014-10-07 19:23:31
@juanchopanza _“用户不需要知道他们正在使用专业化。“_我只是想说同样的事情,+除非接口的行为被特殊化改变(当然这被认为是错误的) – 2014-10-07 19:26:10
如果你不能修改定义了'Stack'的文件,创建另一个文件,比如'MyStack.h',并在该文件中添加专门化。确保#include''MyStack.h'而不是'Stack.h'。 – 2014-10-07 19:26:53