【问题标题】:Override parameter pack declaration and expansion loci覆盖参数包声明和扩展位点
【发布时间】:2022-01-19 20:09:41
【问题描述】:

我有一个简单的接口设置器:

template<typename Interface>
struct FrontEnd
{
  virtual void inject(Interface*& ptr, Client* client) = 0;
}

我想通过这样的参数包来实现这些接口:

template<typename ... Is>
struct BackEnd : public FrontEnd<Is>...
{
   void inject(Is*& ptr, Client* client) override
   {
      ptr = someStuff<Is>.get(client);
   }
};

但是,parameter pack not expanded with '...' 失败了。我在cppref 中找不到类似的东西。我不知道扩展位点应该去哪里(假设这甚至是合法的,我倾向于不这样做)。 知道如何为参数包中的每种类型提供覆盖吗?

【问题讨论】:

  • FrontEnd 只接受一个接口模板参数,因此无论如何您都不能在继承中使用参数包。那你想做什么?无论如何,将模板与虚函数混合并不是我真正推荐的。 stackoverflow.com/questions/2354210/…)
  • @PepijnKramer,第一个 ... 正在扩展 FrontEnd 所以对于每个 Is,BackEnd 都有一个应该能够覆盖的基类
  • @PepijnKramer 我已经知道虚方法不能被模板化,事实上,inject 不是方法模板
  • 对不起,我错过了,我回答得太快了。
  • 有一份详尽的允许扩展位点列表,而您想要的却不存在。

标签: c++ c++17 variadic-templates parameter-pack


【解决方案1】:

你可能想要这样的东西

  template<typename Is>             
  struct OneBackEnd : public FrontEnd<Is>
  {                                 
     void inject(Is*& ptr, Client* client) override { /* whatever */ }
  };                                
                                    
  template<typename ... Is>         
  struct BackEnd : public OneBackEnd<Is>...
  {                                 
      using OneBackEnd<Is>::inject...;
  };                       

【讨论】:

  • 非常聪明。 FWIWstructs默认为public继承,所以可以省略。
  • 确实很聪明!我花了一个多小时思考如何解决这个问题,但没有出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2018-03-28
  • 1970-01-01
  • 2018-09-14
  • 2019-10-15
  • 2017-11-20
相关资源
最近更新 更多