我似乎错过了C++中lambda机制的一些观点.这是代码:
std::vector<int> vec (5);
int init = 0;
std::generate(begin(vec), end(vec), [init]() mutable { return ++init; });
for (auto item : vec) {
std::cout << item << " ";
}
std::cout << std::endl << init << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果没有mutable它就不会编译,因为我正在改变initlambda.
现在,我的理解拉姆达被每一个信息载体的一个项目新的全新副本的init是0,所以,1必须每次都返回.但这段代码的输出是:
1 2 3 4 5
0
它看起来像在执行开始时只generate复制init 一次.但为什么?它应该像这样工作吗?
我想将Serilog配置为在每次运行时创建一个日志文件。
文件名应基于当前日期/时间:
第1次运行: log_20180413_1020.txt
第2次运行: log_20180413_1033.txt
我没有在任何文件接收器(滚动,替代..)中找到如何做的
任何线索?
我所有的遗留代码都在草案中做了这样的事情:
// sadly I have to use this structure
struct LegacyStruct {
int* values;
}
LegacyStruct* LgStr;
....
std::vector<int> vec;
// fill vector in some way here
size_t sz = vec.size();
LgStr->values = new int[sz];
std::copy(vec.begin(), vec.end(), &LgStr->values[0]);
Run Code Online (Sandbox Code Playgroud)
vec可能很大,我需要避免将其复制到int*.有办法吗?我试过以下:
// type of new operator explained in More Effective C++
LgStr->values = new (&vec[0])int[vec.size()];
Run Code Online (Sandbox Code Playgroud)
好的,values指向vec内部数组的开头,但是当vec超出范围时它会被破坏.但我必须保留它..
&vec[0] = nullptr; // does not compile of course
Run Code Online (Sandbox Code Playgroud)
所以问题是:在这种情况下是否可以应用移动语义?或者其他一些技巧?
我有一个像这样的代码:
template<int N, typename T>
class XYZ {
public:
enum { value = N };
//...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法以某种方式限制N?具体来说,我只想在N除以某个数字时允许编译,让我们说6.所以事实证明它不仅仅是一个类型限制.首选方法是在没有Boost的情况下执行此操作.