• 我可以制作方法(=成员函数)指针的模板参数包吗?
  • 如果是,是否可以使(模板)函数执行其模板参数包中的所有方法?

  • 简化:
  • 指向方法的执行顺序无关紧要。
  • 所有方法指针都具有相同的签名(例如,返回bool,具有相同的基类,不带参数)
  • 最佳答案

    template<class T, class...Ms>
    void run_all(T* t, Ms&&... ms) {
      using discard=int[];
      (void)discard{0,(void(
        (t->*ms)()
      ),0)...};
    }
    

    使用:
    struct foo {
      bool t1() { return true; }
      bool t2() const { return false; }
    };
    int main() {
      foo f;
      run_all(&f, &foo::t1, &foo::t2);
    }
    
    run_all有点钝,但这是因为我们没有C++ 17。
    template<class T, class...Ms>
    void run_all(T* t, Ms&&... ms) {
      ((void)((t->*ms)()),...);
    }
    

    这比较简单,甚至:
    template<class T, class...Ms>
    void run_all(T* t, Ms&&... ms) {
      ((t->*ms)(),...);
    }
    

    它依赖t->*ms返回理智的类型。

    我们还可以依靠ms返回bool并执行以下操作:
    template<class T, class...Ms>
    void run_all(T* t, Ms&&... ms) {
      (void)std::initializer_list<bool>{(t->*ms)()...};
    }
    

    要么
    template<class T, class...Ms>
    void run_all(T* t, Ms&&... ms) {
      using discard=bool[];
      (void)discard{false,(t->*ms)()...};
    }
    

    请注意,所有这些命令均按顺序执行其方法,并支持传递0个方法。

    上面的void强制转换中的某些内容用于阻止未使用值的警告。

    还有其他方法可以解决调用返回超载operator,的类型的可能性。

    10-07 19:27
    查看更多