小编Dom*_*lli的帖子

如何复制构造函数和移动构造函数

我的问题是要了解这两个构造函数究竟是如何工作的.我有这门课:

class moveClass
{
  int variabile;
  public:
  moveClass(){} 
      //move constructor
  moveClass(moveClass && arg)
  {
    cout<<"Call move constructor"<<endl;
    variabile = arg.variabile;
  } 
      //copy constructor
  moveClass(const moveClass & arg)
  {
    cout<<"Call copy constructor"<<endl;
    variabile = arg.variabile;
  }  
};
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当我实例化该类的新对象时,将根据参数的类型调用构造函数.

移动构造函数的优点是当rvalue用于实例化对象时,该对象不会被复制,而只是被移动.

1 moveClass a;
2 moveClass b = a;
3 moveClass c = std::move(a);
Run Code Online (Sandbox Code Playgroud)

考虑到这个例子,我可以说当我实例b时,a被复制,然后分配给b?

换句话说,直到第2行,我将在内存中有3个对象:a,b和a_copy.

而第3行只会创建c对象而没有新的复制对象.

基本上在这三行的末尾,我将在内存中有4个对象.它是否正确?

构造函数的代码也是一样的,所以我希望唯一的区别是传递的参数的类型.

c++ copy-constructor move-semantics

5
推荐指数
0
解决办法
106
查看次数

CMake 不带目录路径的文件的 glob 列表

如果您在 CMake 中使用全局文件列表file(GLOB..),则所有文件都会列出并附加其完整路径。

如何在 CMake 中 glob 一组文件,仅保存文件名?

我阅读了官方手册,在这里我发现了这一点:

 file(GLOB <variable>
 [LIST_DIRECTORIES true|false] [RELATIVE <path>]
 [<globbing-expressions>...])
Run Code Online (Sandbox Code Playgroud)

 By default GLOB lists directories - directories are omitted in result 
 if LIST_DIRECTORIES is set to false.
Run Code Online (Sandbox Code Playgroud)

我尝试了这些解决方案,但没有一个有效:

file(GLOB_RECURSE src_files LIST_DIRECTORIES false ${SRC})

file(GLOB_RECURSE src_files LIST_DIRECTORIES=false ${SRC})

file(GLOB_RECURSE src_files LIST_DIRECTORIES(false) ${SRC})

set(LIST_DIRECTORIES false)
file(GLOB_RECURSE src_files ${SRC})
Run Code Online (Sandbox Code Playgroud)

我的输出始终是附加完整路径的文件列表。我知道我可以使用 RELATIVE 来相应地设置路径,但如果可以的话我宁愿避免它。

c++ glob cmake

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

循环typedef列表

如果标题有点误导,我很抱歉.

我有一个循环一些数据的函数.每次迭代时此数据的类型都会发生变化.

基本上我有这样的事情:

for(int i = 0; i < limit; i++)
{
  type object;
  object.do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

这里例如在第一次迭代中"type"将是int,在第二次迭代时"type"将是double,等等.

我不能使用varyadic模板,因为我有超过100个元素,据我所知,它对系统非常重要.

我的想法是创建一个"typedef的向量"来循环所有类型的对象.

vector<????> type;
type.push_back(int);
type.push_back(double);
...
for(int i = 0; i < limit; i++)
{
  type[i] object;
  object.do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否可能.

我看到了类型列表的基础知识,但我不知道是否可以重现循环.

c++ arrays typedef metaprogramming

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