gpt4 book ai didi

c++ - 带有可变参数模板的自定义容器 emplace

转载 作者:行者123 更新时间:2023-11-28 00:18:47 25 4
gpt4 key购买 nike

我正在实现一个简单的圆形 vector 类。我想实现一个 emplace 成员函数,但出现了一个我不明白的错误。对于我做错的事情,这可能是一个简单的修复,但由于我对可变参数模板没有太多经验,我无法弄清楚是什么......

我得到的错误是:

main.cpp: In function 'int main()':

main.cpp:104:50: error: no matching function for call to 'CircularVector<Item>::emplace(int, int, int, int, int, int, std::vector<int>, int)'
v.emplace(1, 0, 1, 0, 1, 0, vector<int>(), -1);
^

main.cpp:104:50: note: candidate is:

main.cpp:20:7: note: void CircularVector<T, Args>::emplace(const Args& ...) [with T = Item; Args = {}]
void emplace(const Args &... args) {
^

main.cpp:20:7: note: candidate expects 0 arguments, 8 provided

产生此错误的源代码是(也位于此处 http://coliru.stacked-crooked.com/a/37d50d6f23363357 ):

#include <vector>

using namespace std;

#define CIRCULAR_BUFFER_DEFAULT_SIZE 5000

template <typename T, typename ...Args>
class CircularVector {
public:
CircularVector(int size) {
_size = size;
_v.reserve(_size);
}

CircularVector() {
_size = CIRCULAR_BUFFER_DEFAULT_SIZE;
_v.reserve(_size);
}

void emplace(const Args &... args) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v.emplace(_indexWrite, args...);
}

void push(const T& item) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v[_indexWrite] = item;
}

void pop(T& item) {
item = _v[_indexRead];
++_indexRead;
if (_indexRead > _size - 1) _indexRead = 0;
--Count;
}

T& back() {
return _v[(_indexRead + Count - 1) % _size];
}


void erase(int numItems) {
_indexRead += numItems;
if (_indexRead > _size - 1) _indexRead -= _size;
Count -= numItems;
}

void eraseAt(int index) {
swap(_v[index], _v[(_indexRead + Count - 1) % _size]);
--Count;
--_indexWrite;
if (_indexWrite < 0) {
_indexWrite = _size - 1;
}
}

void clear() {
_indexRead = 0;
_indexWrite = -1;
Count = 0;
}


T& operator[](std::size_t idx) {
int index = _indexRead + idx;
if (index > _size) index = index % _size;
return _v[index];
};

int Count = 0;

private:
int _indexWrite = -1;
int _indexRead = 0;
int _size = 0;

std::vector<T> _v;
};


class Item {
public:
double A;
int B;
int C;
vector<int> D;
int E;

Item(double a, int b, int c, vector<int> &d, int e) {
A = a;
B = b;
C = c;
D = d;
E = e;
}
};

int main() {
CircularVector<Item> v;
v.emplace(1, 0, 1, 0, 1, 0, vector<int>(), -1);
}

最佳答案

万一有人遇到同样的问题,我是这样实现的:

void emplace(Args&&... args) {
++Count;
++_indexWrite;
if (_indexWrite > _size - 1) _indexWrite = 0;
_v.emplace(_v.begin() + _indexWrite, std::forward<Args>(args)...);
}

尽管我真正想要的是使用该索引中的保留内存构造一个元素,而不是在该特定位置插入新元素。

关于c++ - 带有可变参数模板的自定义容器 emplace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28628484/

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