我正在尝试编写一个非常简单的专用类模板,它具有一个成员变量,并且可以在特殊情况下以不同的方式打印该成员变量。我知道这个例子没什么用,但它很好地说明了问题。
当专门化类模板时,类的专门化似乎不共享相同的成员变量,因此以下代码将无法编译...
#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
,这感觉如果我的话,它很快就会变成大量重复的代码和工作。有很多专业。
如果我所说的是真的,那么在专门的类模板中完全使用成员变量是一种不好的做法吗?是否有任何替代方案可以减少代码重复?
最佳答案
另请看看@0x499602D2的答案,它更简单并且适用于许多实际案例。
你是对的,特化基本上完全独立于彼此和原始模板,所以你必须编写所有新的东西。解决这个问题的一种方法是使用继承。
#include <iostream>
#include <string>
// Class template
template <typename T>
struct Base
{
Base(const T& t)
: t(t)
{}
virtual void print()
{
std::cout << t << std::endl;
}
protected:
T t;
};
template<class T>
struct S: Base<T> {
};
// Specialization
template <>
struct S<std::string>: Base<std::string>
{
void print() override
{
std::cout << "string: " << t << std::endl;
}
};
关于c++ - 成员变量如何与专门的类模板一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59504564/