저는 C++ Templates : The Complete Guide (Addison Wesley)의 책을 읽고 클래스 템플릿의 전문화에 대해 질문합니다. 어떻게 작동하는지 이해하지만 주어진 예제에서이 기능을 사용할 때 이해하는데 어려움이 있습니다. 다음은 스택 클래스의 일반적인 정의입니다 :템플릿 특수화
#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
@juanchopanza _ "사용자는 전문화를 사용하고 있다는 것을 알 필요가 없습니다."_ 인터페이스의 동작이 특수화 (물론 잘못된 것으로 간주 됨)에 의해 변경되지 않는 한 똑같은 말을하려고했습니다. –
'Stack'이 정의 된 파일을 수정할 수없는 경우, 다른 파일을 만들고,'MyStack.h'를 만들고, 그 파일에 특성화를 추가하십시오 .' Stack.h' 대신'#include'MyStack.h'을 반드시 사용해야합니다. –