用模板作为模板参数

本文展示了一个使用C++模板元编程创建泛型容器的示例。通过定义通用模板函数,可以为不同数据类型生成特定数量的容器实例。示例中包括了如何为double、int和string类型生成不同类型的容器,并通过运行时输出展示了容器的具体类型。

#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;

template<typename T>
using Con = vector<T>;
template<typename T>
using Con2 = deque<T>;

template<
	typename T, 
	template<typename,typename>	typename C=vector,
	template<typename> typename E=std::allocator >
C<T,E<T>> f(int size) {
	C<T,E<T>> con;
	for (int i = 0; i < size; ++i)
		con.push_back(T());
	return con;
}

int main() {
	auto x = f<double>(10);
	cout << typeid(x).name() << endl;
	auto y = f<int, deque>(10);
	cout << typeid(y).name() << endl;
	auto z = f<string, deque>(10);
	cout << typeid(z).name() << endl;
}

备查。


### 类模板与自定义类型 在C++中,类模板是一种强大的工具,允许开发者编写通用的代码,这些代码可以处理多种数据类型。类模板不仅可以接受基本类型(如`int`、`double`等)作为模板参数,还可以接受用户自定义的类型作为参数。这种灵活性使得类模板能够广泛应用于各种场景,尤其是在容器类的设计中。 #### 定义类模板模板的定义通常以`template`关键字开头,后跟一个或多个模板参数列表,接着是类的定义。模板参数可以是类型参数(使用`typename`或`class`关键字)或非类型参数(如整数常量)。例如: ```cpp template <typename T> class MyContainer { public: // 成员变量和成员函数 }; ``` 在这个例子中,`T`是一个类型参数,表示该容器可以存储任何类型的元素。 #### 使用自定义类型作为模板参数 当使用自定义类型作为类模板参数时,需要确保该类型满足类模板内部操作的要求。例如,如果类模板中有比较操作,则自定义类型必须重载相应的运算符。以下是一个具体的例子,展示了一个简单的类模板,它接受自定义类型作为参数: ```cpp #include <iostream> #include <string> using namespace std; // 自定义类型 class Person { public: string name; int age; Person(string n, int a) : name(n), age(a) {} // 重载小于运算符,以便于在容器中进行排序 bool operator<(const Person& other) const { return age < other.age; } }; // 类模板 template <typename T> class Container { private: T item; public: Container(T i) : item(i) {} void display() const { cout << "Item: " << item.name << ", Age: " << item.age << endl; } }; int main() { Person p("Alice", 30); Container<Person> container(p); container.display(); return 0; } ``` 在这个例子中,`Person`是一个自定义类型,包含了姓名和年龄两个属性,并且重载了小于运算符以支持排序。`Container`类模板接受一个类型参数`T`,并在其构造函数中初始化一个`T`类型的对象。`display`方法用于输出对象的信息。 #### 注意事项 1. **模板参数匹配**:确保自定义类型提供了类模板所需的所有功能。例如,如果类模板中的某个成员函数调用了`T`的某个方法,则该方法必须存在于自定义类型中。 2. **编译器要求**:由于类模板的实例化发生在编译时,因此编译器需要访问类模板的所有定义。这意味着类模板的实现通常需要放在头文件中,而不是单独的源文件中[^4]。 3. **默认模板参数**:C++允许为类模板提供默认模板参数,这可以简化模板的使用。例如: ```cpp template <typename T = int> class MyClass { public: T value; MyClass(T v) : value(v) {} }; ``` 通过上述方法,可以有效地将自定义类型用作类模板参数,从而编写出更加灵活和通用的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值