在不知道模板参数的情况下传递模板
Passing templates without knowing their parameters
我是C++新手,我不确定我是否只是不知道该怎么做,或者我的方法是否都是错误的。
我有一个处理阶段的管道:每个阶段获取某个维度的数据,对其进行转换(这可能会改变该维度),然后对该数据调用下一阶段。这些维度在编译时已知,并作为模板参数实现。使用的方法setNext
定义以下阶段。
template<unsigned int dimIn, unsigned int dimOut>
class Stage {
void process(Data<dimIn> dataIn) {
Data<dimOut> processed = // do something
mNextStage.process(processed)
}
void setNext(Data<dimOut>) {
// store pointer to next stage
}
}
这按预期工作。为了对多个阶段进行分组并简化它们的构造,我想创建一个可以将不同阶段传递到的管道对象。问题是,阶段的输入/输出维度不相等,所以我不确定如何做到这一点:
template<unsigned int firstDimIn, unsigned int firstDimOut>
class Pipeline {
void addStage(Stage<?,?> stage) {
// template parameters of stage are unknown
}
}
管道也是一个模板,其参数保存第一阶段的输入维度和最后阶段的输出维度。
用法示例:
Stage<6,5> s1;
Stage<5,4> s2;
Stage<4,2> s3;
Pipeline<6,2> pipe;
pipe.addStage(s1);
pipe.addStage(s2);
pipe.addStage(s3);
与其使用.addStage()
逐步构建管道,不如使用初始值设定项列表:
Pipeline<6,2> pipe = {s1, s2, s3};
但我在那里遇到了同样的问题。
您可以创建一个代理并在每次add
后返回一个新类型。这可以利用维度的编译时检查。
template<int NBeg, int NEnd> struct Stage {};
template<int N, int Saved>
struct PipelineBuilder {
template<int M>
PipelineBuilder<M, Saved>
AddStage(Stage<N, M>) { return {}; }
void done() {
static_assert(Saved == N, "Incompatible dim");
}
};
template<int NIn, int NOut>
struct Pipeline {
PipelineBuilder<NIn, NOut> GetBuilder() { return {}; }
};
int main() {
Stage<6,5> s1;
Stage<5,4> s2;
Stage<4,3> s3;
Pipeline<6, 2> p;
p
.GetBuilder()
.AddStage(s1)
.AddStage(s2)
.AddStage(s3)
.done()
;
}
相关文章:
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在给定 std::variant 的情况下检索模板参数包?
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 如何在没有参数包的情况下编写变差函数
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 此函数如何在不传递任何参数的情况下工作?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如何在没有可变参数函数的情况下循环函数的参数
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?