c++ - 在不知道参数的情况下传递模板

标签 c++ templates initializer-list

我是 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
    }
}

Pipeline也是一个模板,它的参数保存着第一阶段的输入维度和最后阶段的输出维度。

示例用法:

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};

但我在那里遇到了同样的问题。

最佳答案

您可以创建一个代理并在每次添加 后返回一个新类型。这可以利用维度的编译时检查。

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()
        ;
}

关于c++ - 在不知道参数的情况下传递模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49903157/

相关文章:

c++ - 静态成员声明为 const 但初始化为 constexpr

c++ - 模板和内联优化乘法

c++ - 集合适配器 - 省略依赖底层集合的 T

templates - 在 Go 模板中随机选择内容

c++ - 为什么在 C++11 中为 std::initializer_list 重载 std::begin() 和 std::end()?

c++ - 用c++打印所有排列

C++:我应该将构造函数主体中分配给的指针成员初始化为 NULL 吗?

java - Eclipse 自定义热键 - 将当前行打印到标准输出

c++ - 将初始化列表与可变参数模板一起使用

c++ - constexpr C++容器–一种将push_back推回到initializer_list或类似方法的方法