可变参数模板推演失败

问题描述 投票:0回答:1

我正在尝试使操作管道类型安全。下面的代码大大简化了,但我相信它具有必要的部分。

我已经尝试了可变参数包的大多数组合和顺序,但我不认为这是问题所在。 我怀疑问题是 https://en.cppreference.com/w/cpp/language/template_argument_deduction#Non-deduced_contexts 的 1),但是那里显示的解决该问题的方法在这里不起作用。

我愿意接受完全避免问题的解决方案,只要操作链经过正确的类型检查,并且最终的 Pipeline 具有正确的 Op<> 类型。

enum DType {
  INT,
  FLOAT,
  DOUBLE,
};

template<DType InputT, DType OutputT>
class Op: public BaseOp {// Do stuff 
};

template<DType InputT, DType OutputT>
class Pipeline:Op<InputT, OutputT> {
vector<Ptr<BaseOp>> pipeline_stages;
public:
  Pipeline(Ptr<OP<InputT, OutputT>> stage) {
    //add to pipeline_stages 
  };
  
  template<DType TempOutputT, class... Stages>
  Pipeline(Ptr<Op<InputT, TempOutputT>> stage, Stages... stages):Pipeline(stage, Pipeline<TempOutputT, OutputT>(stages...)) {}

  template<DType OldOutputT>
  Pipeline(Ptr<Op<InputT,OldOutputT>> stage, Pipeline<OldOutputT,OutputT> other) {
    //Insert stages to vec
  };

  //Do all the Pipeline and Op stuff
};

// Ideally, this would work with auto mypipe.
Pipeline<DType::INT, DType::FLOAT> mypipe(
  make_ptr<CovertOp<DType::INT, DType::FLOAT>>(),
  make_ptr<FloatOp1>(),
  make_ptr<FloatOp2>(param)
  );

c++ variadic-templates
1个回答
0
投票

这个问题是继承类型的模板参数推导

的复杂版本

简而言之:Ptr 与操作没有相同的继承树,因此无法推断出

Ptr<ConvertOp<INT,FLOAT>>
与模板中的
Ptr<Op<INT,FLOAT>>
相关。

© www.soinside.com 2019 - 2024. All rights reserved.