gpt4 book ai didi

c++ - 我是在用这个微不足道的方法调用转发类重新发明轮子吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:20 25 4
gpt4 key购买 nike

我刚刚发现自己创建了一个类

template <typename T> struct invoker {
void operator()(T& it) const {it();}
};

所以我可以通过 invoker<foo>到想要调用 invoker<foo>::operator()(foo&) 的东西(不在我的控制之下)反复使用不同的 foo实例,让它将这些调用转发给 foofoo::operator()()方法。

我知道它只有几行,但这似乎是 STL 的函数式或 boost::bind 可能已经提供的那种东西不知何故。除了我看不到诀窍,如果有的话。 (我确定我不是第一个使用非常类似的东西的人;它有名字吗?)

最佳答案

好吧,您可以使用 std::bind,可能还可以使用 boost::bind 来实现相同的行为:

#include <string>
#include <iostream>
#include <functional>

struct foo {
void operator()() {
std::cout << "Hallo, im at addr: " << std::hex << this << std::endl;
}
};

int main() {
std::function<void(foo*)> fun = std::bind(&foo::operator(), std::placeholders::_1);
foo f1, f2;
fun(&f1);
fun(&f2);
}

输出:

Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969

如果您对参数类型使用模板类,则无需重新发明轮子即可获得相同的行为。

编辑:正如 Crazy Eddie 指出的那样,您可以只使用 boost::mem_fnstd::mem_fn:

std::function<void(foo*)> fun = std::mem_fn(&foo::operator());

代替 bind

关于c++ - 我是在用这个微不足道的方法调用转发类重新发明轮子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10610307/

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