标签: boost-bind

使用boost传递函数指针参数

使用boost :: function和/或boost :: bind可以简化/改进以下函数指针传递吗?

void PassPtr(int (*pt2Func)(float, std::string, std::string))
{
   int result = (*pt2Func)(12, "a", "b"); // call using function pointer
   cout << result << endl;
}

// execute example code
void Pass_A_Function_Pointer()
{
   PassPtr(&DoIt);
}
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-bind boost-function

1
推荐指数
1
解决办法
8740
查看次数

如何使用tr1函数并使用更改参数绑定函数?

我目前正从C#转到C++并重写一些游戏引擎代码,我想我在tr1的墙上; 基本上我想要做的是让输入层从触摸屏获取输入,然后触发回调以通知任何听取该输入的元素.现在tr1/boost似乎通过使用函数绑定使这变得非常容易,但是激活void()的回调没有问题,但是现在我试图在调用时将参数发送到这些回调(例如枚举) .

这里的问题是,当我调用bind并插入参数时,它不会充当占位符,而是充当要传递的永久值.例如我的代码在这里:

包含类:

tr1::function<void (MenuActions action)> callback;
callback = tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral);
m_menuUILayer->registerCallback(callback);
Run Code Online (Sandbox Code Playgroud)

我的目的是创建一个函数并绑定它,然后registerCallback将此回调传递给成员类并存储引用.这部分有效,但现在在成员类中我可以调用回调但是总是发送默认参数...

会员类:

if (m_callback)
{
    m_callback(MenuActions::backgroundTouchDown);
}
Run Code Online (Sandbox Code Playgroud)

因此,在这里,而不是将MenuActions :: backgroundTouchDown发送到回调中的主包含类,仍然使用默认的MenuActions :: neutral.我想知道我是否遗漏了一些东西,或者我的睡眠不足只是让我走错了路?多谢你们!

c++ boost tr1 callback boost-bind

1
推荐指数
1
解决办法
1916
查看次数

缩短boost :: function

将a boost::function作为参数传递给另一个函数(回调)时,此函数的签名可能会变得很长.

示例:
考虑一下boost::function:

boost::function<MyClass * (
      TypeA param1,
      TypeB param2,
      TypeC param3,
      TypeD param4,
      TypeE param5,
      TypeF param6)> CreateMyClass;
Run Code Online (Sandbox Code Playgroud)

现在,如果我们将它boost::function作为函数参数传递,使用它的函数的签名变得非常冗长且难以阅读:

void myFunctionUsingTheCallack(boost::function<MyClass * (
          TypeA param1,
          TypeB param2,
          TypeC param3,
          TypeD param4,
          TypeE param5,
          TypeF param6)> the_callback);
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?是否有任何缩短签名的技巧myFunctionWithTheCallack

c++ boost boost-bind boost-function c++98

1
推荐指数
1
解决办法
58
查看次数

C++ Functors和Zero

首先是免责声明,我正在替换一堆使用boost :: function和boost :: bind的代码.但是,我正在转向不允许rtti的代码库.我想继续使用提升,但不知道是否有办法解决这个限制.

所以,我试图模仿它的一些功能,但更简化.我有一个Callback类:

   template <class Class, typename ReturnType = void> class Callback0 {
   typedef ReturnType (Class::*Method)();

   public:
       Callback0(Class* object, Method method)
           : m_object(object)
           , m_method(method)
       {
          ;
       }

       Callback0(const Callback0& callback)
           : m_object(callback.m_object)
           , m_method(callback.m_method)
       {
          ;
       }

       operator bool() {
           return m_object != 0;
       }

       operator bool() const {
           return m_object != 0;
       }

       ReturnType operator()() {
           return (m_object->*m_method)();
       }

       Callback0<Class, ReturnType>& operator=(const Callback0<Class, ReturnType>& callback) {
           if(this != &callback) {
               m_object = callback.m_object;
               m_method = …
Run Code Online (Sandbox Code Playgroud)

c++ callback boost-bind functor boost-function

0
推荐指数
1
解决办法
834
查看次数

boost :: bind访问器?

假设我有以下代码:

int f(int, int);

int main()
{
    SomeFunc(boost::bind(f, 1, 2));
}
Run Code Online (Sandbox Code Playgroud)

从SomeFunc()函数,是否可以访问绑定类型持有的参数?像这样的东西(伪代码):

// Obvious syntax issues...
void SomeFunc(boost::bind& functor)
{
    if(functor.function == &f)
    {
        if(functor.argument1 == 1)
            DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以从boost :: bind类型中提取这些信息吗?

c++ boost bind boost-bind

0
推荐指数
1
解决办法
392
查看次数

使用std :: shared_ptr而不是boost :: shared_ptr时编译失败

下面的代码成功地向给定端点发送异步消息.

// message is a boost::shared_ptr<std::string>

// open a UDP socket
boost::asio::ip::udp::socket socket(ioService);
socket.open(boost::asio::ip::udp::v4());

// create the remote endpoint
boost::asio::ip::udp::endpoint remoteEndpoint(boost::asio::ip::address_v4::from_string(address), port);

// asynchronously send a datagram to the remote endpoint
socket.async_send_to(boost::asio::buffer(*message),
                     remoteEndpoint,
                     boost::bind(&MyClass::handler,
                                 this,
                                 message,
                                 boost::asio::placeholders::error,
                                 boost::asio::placeholders::bytes_transferred));

socket.close();
Run Code Online (Sandbox Code Playgroud)

但是,如果我将类型更改message为a std::shared_ptr<std::string>而不是a boost::shared_ptr<std::string>则调用async_send_to不会编译.

错误是:

boost/boost/bind/bind.hpp:457:9: No matching function for call to object of type 'boost::_mfi::mf3<void, MyClass, const boost::shared_ptr<std::__1::basic_string<char> > &, const boost::system::error_code &, unsigned long>'.
Run Code Online (Sandbox Code Playgroud)

有人可以解释什么是错的吗?可能是因为我正在使用boost :: bind吗?

c++ boost-bind shared-ptr boost-asio c++11

0
推荐指数
1
解决办法
493
查看次数