Я читаю книгу C++ Templates: The Complete Guide от 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();
}
};
Моя проблема состоит в том, что он, кажется, нарушить принципы ООП о инкапсуляции. Должен ли клиент знать, что существует два определения, может быть, в разных файлах заголовков, а затем знаете, какой из них следует включать на основе типа T, заданного классу Stack? Мне кажется, что в этом сценарии вам лучше всего реализовать два разных класса: один класс Stack и специализированный класс StackString.
Мысли?
Обычно вы включаете специализацию в тот же заголовок. Пользователю не нужно знать, что они используют специализацию. – juanchopanza
@juanchopanza _ «Пользователю не нужно знать, что они используют специализацию.«_ Я как раз собирался сказать то же самое +, если поведение интерфейса не будет изменено специализацией (которая считается ошибочной, конечно). –
Если вы не можете изменить файл, в котором определен' Stack', создайте еще один файл, скажем «MyStack.h» и добавьте специализацию в этот файл. Убедитесь, что '# include'' MyStack.h' вместо 'Stack.h'. –