gpt4 book ai didi

c++ - 如何在不在 C++ 中创建函数对象的情况下将函数指针作为模板值参数传递?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:15 24 4
gpt4 key购买 nike

我在这里看到过这个问题的许多变体,但我仍然觉得我的具体情况有所不同。

我的目标是包装一个如下所示的 C API:

TF_Buffer* buf = TF_AllocateBuffer();
// ...
TF_DeleteBuffer(buf);

因为我有很多这样的对象,所以我想创建一个名为 handle 的通用类型,它可以保存给定的指针并在销毁时调用适当的释放器。我想象的用例是

class buffer : public handle<TF_Buffer, TF_DeleteBuffer> {
public:
buffer(TF_Buffer* b): handle(b) {}
}

不幸的是,我无法让它工作,因为 TF_DeleteBuffer 是一个简单的函数(类型为 void TF_DeleteBuffer(TF_Buffer*))。我确实设法通过为函数创建一个函数对象来解决这个问题,所以下面的方法确实有效

template<typename Obj, typename Deleter>
class handle {
public:
Obj* obj;

handle(Obj* o): obj(o) {};
~handle() { if (obj) Deleter()(obj); }
};

struct buffer_deleter {
void operator()(TF_Buffer* b) { TF_DeleteBuffer(b); }
};

class buffer : public handle<TF_Buffer, buffer_deleter> {
public:
buffer(TF_Buffer* b): handle(b) {}
}

但是为了这个目的而必须定义 buffer_deleter 类感觉很脏。我想像这样的东西应该可以工作(有或没有 std::function)

template<typename Obj, std::function<void(Obj*)> Deleter>
class handle {
// ...
}

但我找不到让编译器满意的方法。据我了解,这有点类似于接受删除器类型对象的 std::unique_ptr,而 std::shared_ptr 接受删除器函数指针并将其存储在共享对象。我不介意显式存储指针(并使用额外的内存),但与此同时,考虑到我将创建许多此类类型,我希望有一些方法可以使它在语法上更好。我真的不想将删除器指针传递给正在创建的对象的每个实例,这就是我试图将其隐藏在模板中的原因。

最佳答案

你可以定义一个non-type template parameter作为函数指针。

template<typename Obj, void(*Deleter)(Obj*)>
class handle {
public:
Obj* obj;

handle(Obj* o): obj(o) {};
~handle() { if (obj) Deleter(obj); }
};

像这样使用它

class buffer : public handle<TF_Buffer, &TF_DeleteBuffer> {
...
};

关于c++ - 如何在不在 C++ 中创建函数对象的情况下将函数指针作为模板值参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57221449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com