我开始使用 C++ 模板只是因为我想了解与其他语言 (Java) 的具体差异并且我达到了它们开始出现分歧的地步但我不知道我应该如何解决具体问题问题(或绕过它)。
假设我有一个通用值类,例如
template <class T>
class Value
{
protected:
T value;
public:
Value(Type type, T value) : type(type), value(value) {}
void set(T value) { this->value = value; }
T get() const { return this->value; }
T clone() { return new Value<T>(type, value); }
virtual string svalue() const = 0;
const Type type;
};
和一个特定的子类型:
class Int : public Value<int>
{
public:
Int(int value) : Value<int>(INT, value) { };
virtual string svalue() const { ... }
friend ostream& operator<<(ostream& os, const Int& v);
};
(我知道也可以通过使用 template <>
来指定特定类型的代码,但由于我仍然需要足够多地使用它来理解它,所以我现在只是通过自己的 Int 类定义,这只不过是 typedef Value<int>
结束)
比方说,是否有可能拥有一个能够存储指向 Value
实例的任意指针的集合?无需指定泛型类的具体具体类型。
据我所知,模板只是一个编译时问题,编译器会分析使用模板的所有具体类型,并为每个类型编译相同方法的不同版本,这就是我想要做的似乎不可能(虽然在 Java 中我被允许对类似 List<Value<?>>
的东西使用通配符)。我错了吗?
是否有解决此问题的通用设计,或者我被迫放弃模板来实现它?
最佳答案
#include <iostream>
#include <memory>
class Base
{
public: virtual void Print() = 0;
};
template<typename T>
class Derived : public Base
{
T V;
public:
void Print() { std::cout << V; }
Derived(T v) : V(v) { }
};
int main()
{
std::unique_ptr<Base> Ptr (new Derived<int>(5));
Ptr->Print();
return 0;
}
我认为这是不言自明的。
关于C++ 模板 - 具有模板化类型的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993328/