答案是使用虚函数实现类型擦除的核心在于通过抽象基类定义统一接口,模板派生类封装具体类型,外部类持有基类指针以实现多态调用。示例中AnyFunction通过继承体系包装任意可调用对象,调用时无需知晓原始类型,从而实现类型无关的接口统一。

在C++中,类型擦除(Type Erasure)是一种让不同类型的对象表现出统一接口的技术,同时隐藏其具体类型。它常用于实现像 std::function、std::any 这样的通用容器。核心思想是将具体类型“擦除”,通过统一的接口调用底层操作。
最常见的方法是借助基类的虚函数机制,把具体类型封装到派生类中,对外暴露统一接口。
步骤:
示例:实现一个简易的任意可调用对象包装器
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <memory>
#include <string>
// 抽象基类
struct FunctionBase {
virtual void call() const = 0;
virtual std::unique_ptr<FunctionBase> clone() const = 0;
virtual ~FunctionBase() = default;
};
// 模板派生类
template<typename F>
struct FunctionWrapper : FunctionBase {
F f;
FunctionWrapper(F f) : f(std::move(f)) {}
void call() const override {
f();
}
std::unique_ptr<FunctionBase> clone() const override {
return std::make_unique<FunctionWrapper>(f);
}
};
// 外部接口类,用户使用
class AnyFunction {
std::unique_ptr<FunctionBase> func;
public:
template<typename F>
AnyFunction(F f) : func(std::make_unique<FunctionWrapper<F>>(std::move(f))) {}
AnyFunction(const AnyFunction& other)
: func(other.func->clone()) {}
AnyFunction& operator=(const AnyFunction& other) {
func = other.func->clone();
return *this;
}
void operator()() const {
func->call();
}
};使用方式:
```cpp void hello() { std::cout 基于模板和函数指针的轻量级类型擦除避免虚函数开销,可以用函数指针+void* 来存储数据和操作函数。
原理: 将操作函数和数据指针绑定,运行时通过函数指针调用。
class SimpleFunction {
void* data = nullptr;
void (*call_func)(void*) = nullptr;
void (*copy_func)(void*, const void*) = nullptr;
public:
template<typename F>
SimpleFunction(F f) {
struct Storage {
F func;
static void call(void* p) {
static_cast<Storage*>(p)->func();
}
static void copy(void* dst, const void* src) {
new(dst) Storage(*static_cast<const Storage*>(src));
}
};
// 假设栈上分配或小对象内嵌(简化起见用new)
data = new Storage{std::move(f)};
call_func = &Storage::call;
copy_func = &Storage::copy;
}
void operator()() const {
call_func(data);
}
~SimpleFunction() {
// 实际需记录大小并调用析构,此处略
}
};这种方式更接近 std::function 的内部实现,支持小对象优化(SOO)时性能更好。
基本上就这些。类型擦除的关键是分离接口与实现,通过中间层屏蔽具体类型。用虚函数最直观,用函数指针+void* 更高效但实现复杂些。根据需求选择合适方式即可。
以上就是c++++怎么实现类型擦除_c++类型擦除实现方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号