小编Igo*_*ack的帖子

在C++中将参数传递给lambda

我似乎错过了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 一次.但为什么?它应该像这样工作吗?

c++ parameters lambda mutable

14
推荐指数
3
解决办法
1万
查看次数

将Serilog文件接收器配置为在每个应用程序运行中使用一个日志文件

我想将Serilog配置为在每次运行时创建一个日志文件。
文件名应基于当前日期/时间:
第1次运行: log_20180413_1020.txt
第2次运行: log_20180413_1033.txt

我没有在任何文件接收器(滚动,替代..)中找到如何做的
任何线索?

.net logging serilog

5
推荐指数
1
解决办法
2283
查看次数

将std :: vector <T>移动到T*

我所有的遗留代码都在草案中做了这样的事情:

// 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)

所以问题是:在这种情况下是否可以应用移动语义?或者其他一些技巧?

c++ stl vector move-semantics c++11

4
推荐指数
1
解决办法
1219
查看次数

限制整数模板参数

我有一个像这样的代码:

template<int N, typename T>
class XYZ {
public:
  enum { value = N };
  //...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式限制N?具体来说,我只想在N除以某个数字时允许编译,让我们说6.所以事实证明它不仅仅是一个类型限制.首选方法是在没有Boost的情况下执行此操作.

c++ int templates restrictions

2
推荐指数
1
解决办法
839
查看次数