C++ 调度程序参数传递

标签 c++ templates reference bind dispatcher

我有一个简单的调度程序结构,它无法编译,老实说,我不知道为什么。

因此,我创建了一个调度程序,您可以将一个函数绑定(bind)到名为 update 的函数,它将调用一个名为 invoke 的静态成员函数,该函数取消引用对象实例并使用简单的 std::ostream 调用该方法引用。

由于某种原因,这无法编译,但对我来说看起来是正确的。 编译器不会给出任何好的输出:/

提前致谢

#include <iostream>
#include <list>
#include <utility>

namespace trd {

  struct dispatcher {
    public:
      template<typename C, void(C::*M)(std::ostream & os) = C::update>
        static void invoke(void * instance, std::ostream & os) {
          (static_cast<C*>(instance)->*M)(os);
        }

      template<typename C, void(C::*M)(std::ostream & os) = &C::update>
        void bind(C * instance) {
          instances.push_back(std::make_pair(&invoke<C, M>, instance));
        }

      void operator () (std::ostream & os) {
        for (auto & instance : instances)
          (instance.first)(instance.second, os);
      }

    private:
      std::list<std::pair<void(*)(std::ostream & os), void *>> instances;
  };

}

struct test {
  public:
    void update(std::ostream & os) { os << "foo"; }
};

int main() {
  trd::dispatcher dp;

  test t;

  dp.bind(&t);

  dp(std::cout);

  return 0;
}

最佳答案

您使用的是方法而不是函数,因此使用 C 风格的强制转换将实例强制转换为 void 是不好的做法。

相反,C++ 有 std::function 和 lambda:

namespace trd {

  struct dispatcher {
    public:
      template<typename C, void(C::*M)(std::ostream & os) = &C::update>
        void bind(C * instance) {
          instances.push_back([=](std::ostream & os){std::invoke(M, instance, os);});
        }

      void operator () (std::ostream & os) {
        for (auto & instance : instances)
          std::invoke(instance, os);
      }

    private:
      std::list<std::function<void(std::ostream & os)>> instances;
  };
}

使用 C++17 进行 std::invoke

关于C++ 调度程序参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747991/

相关文章:

c++ - 我可以从 C++ 中的 std::string 中分离缓冲区吗?

c++ - OpenCV solvePnP 获取相对于相机的图案原点位置

c++ - 错误 : expected unqualified-id before '||' token

c++ - 在运行时确定返回类型是右值还是左值时,如何避免不必要的复制?

c++ - 如何从 C++ 中的函数返回对象引用以及如何从客户端调用该函数?

C++相当于Python的日志库

c++ - std::min_element 获取迭代器的结果

javascript - 如何正确分离 JavaScript View /逻辑代码

c++ - 如何使模板别名作为模板类

perl - 如何直接取消引用存储在另一个哈希中的哈希引用?