gpt4 book ai didi

c++ - 传递给模板函数的可变模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:02 24 4
gpt4 key购买 nike

我有一个类(class)接受一个 int模板参数,和一个 int参数包(neurons)。构造函数的目标之一是获取包中的每个参数并将类的实例添加到 vector 中。然而,该类将其参数作为模板参数。

我有以下代码:

template<int iCount, int... neurons>
class network {
private:
std::vector<pl> layers;
public:
network() : layers() {
input_layer<iCount> inp;
layers.push_back(inp);
addLayer<iCount, neurons...>();
}
template<int prev, int nc, int... further>
void addLayer() {
layer<nc, prev> l;
layers.push_back(l);
addLayer<nc, further...>(); // error is here
}
};

标有“错误在这里”的递归调用产生编译器错误:“错误 4 错误 C2783:‘void network<1,3,2,1>::addLayer(void)’:无法推导出 'nc' 的模板参数"

plinput_layer 的父类和 layer .

目前,我使用 network像这样:

network<1, 3,2,1> n;

调用构造函数后,我希望 n.layers 包含四个元素。第一个是 input_layer ,其中 iCount通过了,剩下的是layer s 与 neurons 中的相应条目作为其 nc , 以及上一层的 nc作为其 prev .

最佳答案

所以首先,你有 object slicing , 所以你想要:

std::vector<std::unique_ptr<pl>> layers;

接下来,我们可以在没有任何递归的情况下在一个函数中完成此操作:

network() : layers() {
layers.push_back(std::make_unique<input_layer<iCount>>());
addLayers<iCount, neurons...>(std::make_index_sequence<sizeof...(neurons)>());
}

template <int... Pack, size_t... Is>
void addLayers(std::index_sequence<Is...> ) {
static constexpr int array[] = {Pack...};

int unused[] = {0,
(layers.push_back(std::make_unique<layer<array[Is+1],array[Is]>>()), 0)...
};
(void)unused;
}

此解决方案的灵感来自 T.C. 的回答 here .

关于c++ - 传递给模板函数的可变模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30787169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com