与std::bind相反,向函数中添加虚拟参数
Opposite of std::bind, add dummy parameters to function
我需要一些与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(); });
相关文章:
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 添加虚拟析构函数会使代码大小膨胀
- 为什么虚拟类的析构函数不会自动添加到 vtable 中?
- 在派生类中添加虚拟说明符
- 将static_pointer_cast添加到<Derived> std::list<shared_ptr<Base>> 会导致称为 error 的纯虚拟方法
- 为什么此指针值在C 中添加虚拟关键字后更改
- 为什么添加虚拟方法在C 中增加了类大小
- 当我在派生类中添加额外的虚拟功能时,什么是开销
- 如何正确覆盖虚拟方法以添加功能
- 为什么没有将虚拟静态成员添加为C++的一个功能
- 将第一个虚拟函数添加到类中
- 为特定虚拟方法添加更多参数
- 在C++中为纯虚拟/抽象函数添加主体
- 在C++中,是否允许强制转换为仅添加非虚拟方法的派生类
- 向虚拟方法添加默认参数
- C++在多态子类中添加虚拟方法
- 与std::bind相反,向函数中添加虚拟参数
- 向std::packaged_task添加虚拟复制构造函数
- 使用代理向Qt SQL模型添加虚拟列
- 如何使用C++在Windows中添加虚拟文件夹