我正在阅读类模板本身如何拥有一个模板函数的成员函数,但本书的例子并没有明确为什么这是必要的。如果它已经是一个类模板,我会认为其中需要使用泛型类型的任何函数已经能够使用它们而不需要将其自身定义为模板函数...如果这有意义吗?
答案 0 :(得分:1)
以下是模板化类中模板化成员函数的示例用法,作为具有自定义键的特定基类的统一存储。
struct Base
{
virtual void print() const= 0;
virtual ~Base(){}
};
#include <iostream>
template <typename T>
struct Derived: Base
{
T t;
void print() const{ std::cout<< t<< '\n'; }
Derived(T const &t): t(t){}
};
#include <map>
#include <memory>
template <typename K>
struct Collection
{
std::map<K, std::unique_ptr<Base>> datum;
template <typename T>
void add(K const &key, T const &t)
{
datum.insert(std::make_pair(key, std::unique_ptr<Base>(new Derived<T>(t))));
}
void print(K const &key){ datum.at(key)-> print(); }
};
int main()
{
Collection<int> c;
c.add(0, 42);
c.add(1, std::string("hi"));
c.print(0);
c.print(1);
}
此处,K
的类模板参数Collection
用作std::map
键的类型,成员函数模板add
用于选择可以的派生类使用成员函数模板参数T
构建。