与std::bind相反,向函数中添加虚拟参数

Opposite of std::bind, add dummy parameters to function

本文关键字:添加 虚拟 函数 参数 std bind 相反      更新时间:2023-10-16

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

。我有这个函数:

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

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

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

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

@EthanSteinberg:λ?

[] (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;
}

从这个泛化将需要一些更繁重的工作。我想我在过去的帮助器中看到过"剖析"(使用元编程)std::function<>的签名,你应该能够使它识别非void函数,甚至可能在末尾或中间添加一个参数(棘手的是,就我现在所知)。

但是对于你在OP中的简单案例,看起来你已经被覆盖了

您可以使用lambda,如果您的实现支持它:

processFunction([=](int a){ myFunc(); });