c++ - 可变参数模板的扩展参数列表

标签 c++ templates variadic

我正在为一个研究项目开发基于事件的架构。该系统目前使用 Qt 信号,但我们正试图摆脱 Qt,所以我需要一些几乎可以像 Qt 事件循环和跨线程信号一样工作的东西。

可能与我更好的判断相反,我选择使用可变参数模板来创建一个通用事件,该事件将用于在目标线程中执行回调。

template<typename dest, typename... args>
class Event {
  public:
    Event(dest* d, void(dest::*func)(args...), args... a)
      : d(d), func(func), pass(a...) { }

    virtual void perform() {
      (d->*func)(pass...);
    }

  protected:

    dest* d;
    void(dest::*func)(args...);
    args... pass;
};

我还没有发现任何表明这是否可能的信息。但是,我很难相信事实并非如此。鉴于此,我想知道是否有办法做这样的事情,如果没有,为什么?另外,如果有人有更好的方法来做到这一点,我会欢迎这个建议。

最佳答案

嗯。我想我得到了一些讨厌的东西。代码不是很漂亮或很好,但您可能明白了。您应该能够使用模板递归存储任何类型的对象,并在调用函数时递归遍历它们。

#include <iostream>

template<typename first_arg, typename... args>
class Event
{
   public:

      Event(void (*fn)(first_arg, args...), first_arg first, args... in) : m_func(fn), var(first, in...) {}

      void operator()()
      {
         var(m_func);
      }

   private:
      void (*m_func)(first_arg, args...);

      template <typename t_arg, typename... t_args>
      struct storage;

      template <typename t_arg>
      struct storage<t_arg>
      {
         storage(t_arg t) : m_var(t) {}

         template<typename t_func, typename... tt_args>
         void operator()(t_func fn, tt_args... p)
         {
            fn(p..., m_var);
         }

         t_arg m_var;
      };

      template <typename t_arg, typename t_arg2, typename... t_args>
      struct storage<t_arg, t_arg2, t_args...>
      {
         storage(t_arg t, t_arg2 t2, t_args... p) : m_var(t), m_storage(t2, p...) {}

         template<typename t_func, typename... tt_args>
         void operator()(t_func fn, tt_args... p)
         {
            m_storage(fn, p..., m_var);
         }

         t_arg m_var;
         storage<t_arg2, t_args...> m_storage;
      };

      storage<first_arg, args...> var;
};

void test(int a, float b)
{
   std::cout << a << std::endl << b << std::endl;
}

int main()
{
   Event<int, float> event(test, 10, 100.0);
   event();
}

此外,我认为 std::bind 做了类似的事情,但不确定 :D

关于c++ - 可变参数模板的扩展参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3834508/

相关文章:

c++ - 为什么在可怕的菱形情况下需要父类(super class)空构造函数但不调用?

c++ - Visual C++,CArchive 序列化

c++ - 具有类型特征的模板元编程 : Why does the first code compile and the second doesn't?

php - 如何为可变函数编写 Doxygen 注释,即具有未定义参数数量的函数?

function - 如何处理 Scheme 中未指定数量的参数?

c++ - 用类处理二维数组的一个小问题

c++ - 如何修复类函数 "prototype does not match"和 "cadidate is"错误

jsf - <f :viewParam> not working when using <ui:composition template>

c++ - 为什么模板只能在头文件中实现?

c - 用于打印可变参数的宏,可以选择无参数