我正在尝试使操作管道类型安全。下面的代码大大简化了,但我相信它具有必要的部分。
我已经尝试了可变参数包的大多数组合和顺序,但我不认为这是问题所在。 我怀疑问题是 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)
);
这个问题是继承类型的模板参数推导
的复杂版本简而言之:Ptr 与操作没有相同的继承树,因此无法推断出
Ptr<ConvertOp<INT,FLOAT>>
与模板中的 Ptr<Op<INT,FLOAT>>
相关。