gpt4 book ai didi

C++模板函数类型推导

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

我有这个代码:

template <typename T, void (*f)(T*)>
class callfn
{
public:
void operator()(T* obj) const
{
f(obj);
}
};

void call(int* foo) {}

void test()
{
callfn<int, call> fun;
fun(1);
}

这往往工作正常。然而,类型 callfn 到处都在使用,如果我能这样调用它,我会更喜欢

callfn<call> fun;

相反,在不修改call 类型的情况下,是否可以安排callfn 模板,使其能够推断出T 类型来自 f?

最佳答案

aaronman 之上添加的 post .尽管您不能单独使用模板类,但使用一些帮助程序(包括宏)是可能的:

template <typename T>
T deduce(void(*)(T*));

#define CALLFN(f) callfn<decltype(deduce(f)), f>

使用示例:

CALLFN(call) fun; // instead of 'callfn<call> fun;' as asked

但是,从 OP 的评论来看,这只是一个问题,没有这个问题的解决方案似乎更简单。

如果我理解正确的话,你想为特定类型 T 创建一个 std::unique_ptr 并使用自定义函数删除器 f (void (*)(T*) 类型)但您不希望在 std::unique_ptr 中承载函数指针的开销。例如,考虑:

class MObj { /* ... */ };
void mfree(MObj*) { /* ... */ }

正如我们通常在 OP 的评论中所说的那样

std::unique_ptr<MObj, void(*)(MObj*)> p1(nullptr, mfree);
assert(sizeof(p1) == sizeof(MObj*) * 2);

但是使用callfn我们可以节省空间:

std::unique_ptr<MObj, callfn<MObj, mfree>> p2;
assert(sizeof(p2) == sizeof(MObj*));

我认为上述解决方案的唯一烦恼是需要键入 callfnMObj 两次。那么,这个怎么样:

template <typename T, void (*f)(T*)>
using light_unique_ptr = std::unique_ptr<T, callfn<T, f>>;

light_unique_ptr<MObj, mfree> p3; // 1
assert(sizeof(p3) == sizeof(MObj*));

我也明白(也许我错了)意图是有更短的东西,比如

lighter_unique_ptr<mfree> p4; // 2
assert(sizeof(p4) == sizeof(MObj*));

并让编译器从 mfree 中推断出指向对象的类型。正如我所指出的,这可以通过宏来完成,但我认为这不是一件好事,原因有二:

  1. 如果我们对 mfree 有不同的重载(例如 void mfree(MObj*)void mfree(Foo*)).
  2. 用户通常希望在实例化和(最终)删除器中看到 std::unique_ptr 的指向类型。上面的第 1 行确实显示了类型 (MObj),但第 2 行没有。看不到类型可能会让某些人感到困惑。

我同意上面的第二点是有争议的(类似于我应该使用汽车的辩论)。

关于C++模板函数类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852033/

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