gpt4 book ai didi

c++ - 与 std::bind 相反,为函数添加虚拟参数

转载 作者:可可西里 更新时间:2023-11-01 15:20:28 34 4
gpt4 key购买 nike

我需要一些与 std::bind 相反的东西,它将虚拟参数添加到函数签名而不是 boost::bind 如何绑定(bind)参数。

例如我有这个功能:

std::function<void (void)> myFunc;

但我想把它转换成 std::function<void(int)>传递给这个函数

void processFunction( std::function<void(int)> func);

最佳答案

编辑 哦,我在聊天中提到了显而易见的:

@EthanSteinberg: lambdas?

[] (int realparam, int dummy) { return foo(realparam); }

但它被驳回了,这就是为什么我跳到:

编辑 我刚刚意识到一个更简单的方法: http://ideone.com/pPWZk

#include <iostream>
#include <functional>
using namespace std::placeholders;

int foo(int i)
{
return i*2;
}

int main(int argc, const char *argv[])
{
std::function<int(int, int)> barfunc = std::bind(foo, (_1, _2));
std::cout << barfunc(-999, 21) << std::endl;

// or even (thanks Xeo)
barfunc = std::bind(foo, _2);
std::cout << barfunc(-999, 21) << std::endl;
}

<子>

可变参数模板 http://ideone.com/8KIsW

基于可变参数模板的稍长的答案可能会导致调用站点的代码更小(如果您想用长参数列表包装函数)。

#include <iostream>
#include <functional>

int foo(int i)
{
return i*2;
}

template <typename Ax, typename R, typename... A>
struct Wrap
{
typedef R (*F)(A...);
typedef std::function<R(A...)> Ftor;

Wrap(F f) : _f(f) { }
Wrap(const Ftor& f) : _f(f) { }

R operator()(Ax extra, A... a) const
{ return _f(a...); /*just forward*/ }

Ftor _f;
};

template <typename Ax=int, typename R, typename... A>
std::function<R(Ax, A...)> wrap(R (f)(A...))
{
return Wrap<Ax,R,A...>(f);
}

template <typename Ax=int, typename R, typename... A>
std::function<R(Ax, A...)> wrap(std::function<R(A...)> functor)
{
return Wrap<Ax,R,A...>(functor);
}

int main(int argc, const char *argv[])
{
auto bar = wrap(foo);
std::function<int(int, int)> barfunc = wrap(foo);

std::cout << barfunc(-999, 21) << std::endl;

// wrap the barfunc?
auto rewrap = wrap(barfunc);
std::cout << rewrap(-999, -999, 21) << std::endl;

return 0;
}

从中概括需要做更多的繁重工作。我想我在过去看到过 helpers 来“剖析”(使用元编程)std::function<> 的签名,你应该能够让它识别非 void 函数,甚至可能添加一个参数在最后或中间(据我所知,这很棘手)。

但是对于您来自 OP 的简单案例,看起来您已被覆盖

关于c++ - 与 std::bind 相反,为函数添加虚拟参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8549470/

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