首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可变模板函子调用

可变模板函子调用
EN

Stack Overflow用户
提问于 2016-12-23 23:20:13
回答 2查看 586关注 0票数 5

因此,我一直试图使用各种模板来从更方便的子类型中组合对象,但我很难让它完全按照我的意愿完成。

代码语言:javascript
复制
template<class ...Functor>
struct SeqMethod:public Functor...{
  template<class F>
  void call(F& a){
    F::operator()();
  }
  template<class F,class ... funcs>
  void call(){
    F::operator()();

    call<funcs...>();
  }
  public:
  void operator()(){
    call<Functor...>();
  }
};

这不是有效的语法,所以有。

理想情况下,我希望能够使用这样的东西

代码语言:javascript
复制
class A{
public:
  void operator()(){
    std::cout<<"A";
  }
};
class B{
public:
  void operator()(){
    std::cout<<"B";
  }
};

class C:public SeqMethod<A,B>{};

在这种情况下,应该输出"AB",并且通常适合于将行为组合在一起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-23 23:50:31

最简单的方法是使用C++17的折叠表达式

代码语言:javascript
复制
template<class ...Functor>
struct SeqMethod:public Functor...{

 public:
    void operator()(){
        (Functor::operator()(),...);
    }
};

class A{
public:
    void operator()(){
        std::cout<<"A";
    }
};
class B{
public:
    void operator()(){
        std::cout<<"B";
    }
};

class C:public SeqMethod<A,B>{};

int main()
{
    C c;
    c();
    return 0;
}

输出(用gcc 6.2测试):

代码语言:javascript
复制
AB
票数 3
EN

Stack Overflow用户

发布于 2016-12-23 23:50:23

在您的情况下,实际上不需要任何call成员函数。

相反,您可以在C++11/C++14中这样做:

代码语言:javascript
复制
template<class ...Functor>
struct SeqMethod:public Functor...{
  public:
  void operator()(){
      int _[] = { (Functor::operator()(), 0)... };
      return void(_);
  }
};

下面是一个最小的工作示例:

代码语言:javascript
复制
#include<iostream>

template<class ...Functor>
struct SeqMethod:public Functor...{
  public:
  void operator()(){
    int _[] = { (Functor::operator()(), 0)... };
    return void(_);
  }
};

class A{
public:
  void operator()(){
    std::cout<<"A";
  }
};
class B{
public:
  void operator()(){
    std::cout<<"B";
  }
};

class C:public SeqMethod<A,B>{};

int main() {
  C c;
  c();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41308868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档