Я пытаюсь написать очень простой специализированный шаблон класса, который имеет переменную-член и может печатать эту переменную-член по-разному в особых ситуациях. Я знаю, что пример довольно бесполезен, но он довольно хорошо иллюстрирует вопрос.
При специализации шаблонов классов кажется, что специализации класса не используют одни и те же переменные-члены, поэтому следующий код не будет компилироваться...
#include <iostream>
#include <string>
// Class template
template <typename T>
struct S
{
S(const T& t)
: t(t)
{}
void print()
{
std::cout << t << std::endl;
}
private:
T t;
};
// Specialization
template <>
struct S<std::string>
{
void print()
{
// ERROR: "t" is not defined in this context
std::cout << "string: " << t << std::endl;
}
};
Это говорит о том, что мне нужно было бы написать отдельный конструктор для каждой специализации и иметь отдельную переменную-член t
для каждой специализации, которая кажется, что это быстро станет большим количеством дублированного кода и усилий, если у меня будет много специализаций.
Если то, что я говорю, верно, то является ли плохой практикой вообще использовать переменные-члены в специализированных шаблонах классов? Существуют ли какие-либо альтернативы, которые приводят к меньшему дублированию кода?