gpt4 book ai didi

c++ - 如何使用 get std::bind 之类的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:13 24 4
gpt4 key购买 nike

我正在尝试为 std::bind 编写一个包装器。我的第一次尝试是:

typedef std::function<void(float, int)> tCallback;

template<typename F, class... Args>
tCallback mybind(F f, Args... args)
{
return std::tr1::bind( f, Args... args,
std::tr1::placeholders::_1, std::tr1::placeholders::_2 );
}

给出类似的东西:

struct Foo {
tCallback m__cb;
setcb(tCallback cb) {m_cb = cb;}
....
};

void f1(float f, int i) {}
void f2(int j, float f, int i) {}

Foo foo;
foo.setcb( mybind( f1 ) ); // Fine.
foo.setcb( mybind( f2, 1 ) ); // Not fine.

我做错了什么?在 Visual Studio 上,错误是指以“int &”开头的 Args(这让我感到惊讶,但我可能会记下几层错误消息)。在 GCC 上,错误指的是“参数太多”。 (我还没有天真到期望从像这样深度模板化的代码中得到有用的错误信息!)

我是否需要为函数指针和成员函数指针编写 mybind 版本(以及我如何处理仿函数)?

注意:我使用的是 VS2015 和 GCC 4.9,所以 std::bind 和占位符在 tr1 中。

最佳答案

由于 Args...args 应该只是 args...,如评论中所述,您会收到错误。

同时考虑使用 std::forward 来正确转发你的参数并且更喜欢使用 decltype 来确定包装函数的返回类型这不会强制转换为 std::function:

#include <functional>

typedef std::function<void(float, int)> tCallback;

template<typename F, typename... Args>
auto mybind(F f, Args... args)
-> decltype(std::bind(std::forward<F>(f), std::forward<Args>(args)...,
std::placeholders::_1, std::placeholders::_2 ))
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
return std::bind(std::forward<F>(f), std::forward<Args>(args)...,
// ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^~~~~
std::placeholders::_1, std::placeholders::_2 );
}

struct Foo {
tCallback m_cb;
void setcb(tCallback cb) {m_cb = cb;}
};

void f1(float f, int i) {}
void f2(int j, float f, int i) {}

int main()
{
Foo foo;
foo.setcb( mybind( f1 ) ); // Fine.
foo.setcb( mybind( f2, 1 ) ); // Not fine.
}

Demo


只是关于笔记的快速说明:-)

Note: I'm using VS2015 and GCC 4.9, so the std::bind and placeholders are in tr1.

std::bind 已从 Visual Studio 2013(2012) 移入 std 命名空间,并且应该优先于 tr1 命名空间。

关于c++ - 如何使用 get std::bind 之类的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190242/

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