vector包装器

C++模板类是多态的一种表达形式,如vector一类的模板是编译时多态,通过一个简单的包装就可以实现运行时多态,已达到工程上的形式统一,体现了一种coding的美。

对于标准模板库只能用聚合,不能用继承,因为标准模板库的类模板的虚构函数一般都不是虚拟函数,如果继承的话会导致虚构子类时的不确定行为。

#ifndef _VECTOR_H_
#define _VECTOR_H_

#include <vector>

class Vector
{
private:

	std::vector<void *> vec;

public:

	Vector()
	{
	}

	bool add(void *obj)
	{
		if (0 <= indexOf(obj))
			return false;
		vec.push_back(obj);
		return true;
	}

	bool remove(void *obj)
	{
		int idx = indexOf(obj);
		if (idx < 0)
			return false;
		vec.erase(vec.begin() + idx);
		return true;
	}

	int indexOf(void *obj)
	{
		int cnt = size();
		for (int n=0; n<cnt; n++) {
			//if (obj == ((void *)at(n)))
			if (obj == (void *)(vec[n]))
				return n;
		}
		return -1;
	}

	void *get(int index) 
	{
		if (index < 0)
			return NULL;
		if (size() < (index+1))
			return NULL;
		return (void *)vec[index];
		//return (void *)at(index);
	}

	bool insertAt(void *obj, int index)
	{
		if (0 <= indexOf(obj))
			return false;
		vec.insert(vec.begin() + index, obj);
		return true;
	}

	int size()
	{
		return (int)vec.size();
	}

	void clear()
	{
		vec.clear();
	}
};

#endif


### 关于 `wrapper` 包装器的概念 在编程领域,`wrapper` 包装器是一种设计模式,用于封装其他对象或功能,以便提供额外的功能或改变行为。这种模式广泛应用于多种编程语言和技术栈。 #### C++ 中的 `std::reference_wrapper` 对于C++而言,`std::reference_wrapper` 是一种特殊的包装器,允许将引用作为值传递给容器或其他接受对象的地方[^1]。通常情况下,在C++中无法直接将引用存入标准容器(如vector, list),因为这些容器期望的是实际的对象而非它们的引用。然而通过使用`std::reference_wrapper<T>`,就可以绕过这个限制: ```cpp #include <iostream> #include <functional> // For std::ref and std::cref #include <vector> void printValues(const std::vector<std::reference_wrapper<int>>& values){ for(auto& value : values){ std::cout << value.get() << " "; } } int main(){ int a = 1; int b = 2; std::vector<std::reference_wrapper<int>> refs{std::ref(a), std::ref(b)}; printValues(refs); ++a; // 修改原始变量会影响 vector 内部的内容 printValues(refs); return 0; } ``` 这段代码展示了如何利用`std::reference_wrapper`来创建指向不同整数变量的引用列表,并且当修改原变量时,该变化也会反映到对应的引用上。 #### Java中的 Wrapper 类型 而在Java里,基本数据类型的包装类也被称为 wrapper classes,比如 Integer 对应 int、Double 对应 double 等等。这类包装器主要用于实现泛型集合操作以及处理null值的情况[^2]。例如: ```java Integer num = new Integer(42); System.out.println(num.toString()); ``` 这里我们看到一个简单的例子,其中`new Integer()` 创建了一个新的 Integer 实例,它包含了指定的 int 值并提供了更多实用的方法来进行数值转换和其他操作。 #### SwiftUI Property Wrappers SwiftUI引入了属性包装器(property wrappers),这是一种简化状态管理的方式之一[^3]。开发者可以通过自定义修饰符来自动生成 getter 和 setter 方法,从而更容易地跟踪视图的状态变更。下面是一个简单示例展示如何声明带有 @State 属性包装器的变量: ```swift import SwiftUI struct ContentView: View { @State private var textValue: String = "" var body: some View { TextField("Enter Text", text: $textValue) .padding() } } ``` 在这个片段中,@State 表明此字段应该由 SwiftUI 自动管理和更新其生命周期内的任何更改。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值