我想测试使用std::deque
,std::deque::cleaner
和std::deque::swap
清除std::deque::pop_back
的方法更快。
为此,我创建了一个程序:
Testit
并使用特定方法接收lambda的函数; 当我运行程序时,我已经得到了" bad_function_call "。
该程序出了什么问题?如何修复它以使struct / class按照lambda成员的意愿运行?
您可以在下面看到该计划的重要部分:
//Procedure to test. It receive a lambda with the method to clean the deque up.
int Testit(auto& fCleanUp_the_Container) {
(...)
deque<string> vdTEST; //deque to be tested
//Add elements to vdTEST
fCleanUp_the_Container(vdTEST);
(...)
}
struct dData {
//The Description and lMethodtoCleanUp will be initialize with the std::vector::emplace_back method.
dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp) {};
int Results = 0;
string Description;
function<void(deque<string>& vdTEST)> lMethodtoCleanUp;
};
int main () {
(...)
//upload the data to a vector;
vector<dData> dDt;
dDt.emplace_back("clear", [](deque<string>& vdTEST) {vdTEST.clear();}); //Using std::deque::clear
dDt.emplace_back("swap", [](deque<string>& vdTEST){deque<string> vdTMP; vdTEST.swap(vdTMP);}); //Using std::deque::swap
dDt.emplace_back("pop_back", [](deque<string>& vdTEST){while (!vdTEST.empty()) vdTEST.pop_back();}); //Using std::deque::pop_back
//running the test
for (int iIta=1; iIta != noofCycles; iIta++) {
cout << "\nCycle " << iIta << "...";
for (auto& iIt : dDt) //Test all members of dDt
iIt.Results += Testit(iIt.lMethodtoCleanUp);
}
(...)
}
答案 0 :(得分:2)
你的构造函数
dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp) {};
忽略其参数Description
和lMethodtoCleanUp
。它不会初始化同样恰好名为Description
和lMethodtoCleanUp
的类成员。
你应该做两件事:
正确的构造函数实现将是:
dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp)
: Description(Description), lMethodtoCleanUp(lMethodtoCleanUp) {};
注意例如Description(Description)
两次出现的Description
引用了两个不同的变量:类成员和构造函数参数。