gpt4 book ai didi

c++ - 单表达式成员函数指针

转载 作者:行者123 更新时间:2023-12-03 06:59:52 24 4
gpt4 key购买 nike

为类的特定实例表示指向成员函数的指针的标准方法是使用指向实例的指针和指向成员函数的指针:

void Execute(Foo* inst, void (Foo::*func)(int), int x) {
(inst->*func)(x);
}
...
Execute(foo, &Foo::Bar, 42);
有没有办法定义 Execute 以便将函数指针表示为单个表达式?
例如:
void Execute(SomeType v, int x) {
(v.inst->*v.func)(x);
}
...
Execute(foo->Bar, 42);
我的主要问题是,在我的特定情况下, Foo嵌套在一个长而不稳定的命名空间链下,因此使用标准语法的实际调用看起来更像是 Execute(foo, &hello::darkness::my::old::friend::Foo::Bar, 42) .我几乎总是有一个本地 foo然而,我可以从中引用更简单的 foo->Bar(42) .不过我需要做一些额外的记账,这就是为什么我需要用类似 Execute 的东西来包装电话。 . using不幸的是,指令和命名空间别名不是一个选项。

最佳答案

Is there any way to define Execute such that the function pointer is represented as a single expression?


是的。更改函数以使用 std::function或可调用的模板参数,例如:
#include <functional>

void Execute(std::function<void(int)> v, int x)
{
v(x);
}
template<typename Callable>
void Execute(Callable v, int x)
{
v(x);
}
然后你可以使用 std::bind()或输入表达式的 lambda,例如:
#include <functional>

using namespace std::placeholders;
using FooType = std::remove_reference<decltype(*foo)>::type;

Execute(std::bind(&FooType::Bar, foo, _1), 42);
// or, in C++20 and later:
Execute(std::bind_front(&FooType::Bar, foo), 42);
Execute([=](int x){ foo->Bar(x); }, 42);

另外,顺便提一下,在 C++Builder 中,有一个 __closure允许调用成员方法而根本不需要限定类类型的扩展,例如:
typedef void (__closure *TExecuteCallable)(int);

void Execute(TExecuteCallable v, int x)
{
v(x);
}

...

Execute(foo->Bar, 42);
// or
Execute(&(foo->Bar), 42);

关于c++ - 单表达式成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64902271/

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