小编oLe*_*Len的帖子

可以在C++中隐藏继承层次结构的一部分吗?

考虑以下:

B从类中公开继承A.两者都在库中提供,我无法修改它们.

我想实现一个Foo派生自的类B,但我想允许用户Foo只使用AFoo(而不是B)的公共函数.对于他们来说,Foo继承自己是不相关的B,这原则上是我无法避免的实现细节.

因此,原则上我想Foo公开继承A,但私下来B.

是否有一些C++中的构造允许我这样做?

我必须补充说,虚拟继承不是一个选项,因为A在我的例子中,派生自QObject(如果QObject是直接派生的话,请参阅使用*virtual*multiple inheritance是否安全?).

(注意:对于感兴趣的人:就我而言,AQWindowBQt3DExtras::Qt3DWindow)

c++ oop inheritance qt

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

移动构造函数的静态断言与复制构造函数不同

想象一下,我有一个A移动便宜且复制费用昂贵的课程.它可能看起来像

class A {
  public: 
    [...]

  private:
    HeavyClass m;
};
Run Code Online (Sandbox Code Playgroud)

对于这个类,我想要一个静态验证,类(1)是可构造的,(2)不是简单地使用复制构造函数进行移动构造,而与是否显式声明移动构造函数无关.

这可能吗?

至于为什么我想这样做,请考虑以下示例:首先,该类自动生成移动构造函数,并根据需要运行.然后,有人更改了类并添加了析构函数,这导致不会隐式生成移动构造函数,而是使用复制构造函数.

因此,a static_assert会是理想的,但似乎这里没有is_move_constructibleis_trivially_move_constructible有帮助.

此外,我知道有可能拥有A(A&&) = default;所有这样的类,但是具有static_assert更清晰的解决方案并允许在类定义之外进行检查(在依赖于此类的其他项目中进行检查).

编辑:
我不想禁止复制构造,我只想确保移动构造函数不使用它...

c++ move-semantics c++11

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

CMake库依赖项

这可能有点难以解释.我已经为我正在编写的一系列C++库设置了一个目录结构.我打算用CMake来处理这些库的构建.在大多数情况下,这些库是完全独立的"子系统",但在奇怪的地方,一个库需要访问另一个库中包含的头文件.这是我的目录结构.

base
 ?? cmake
 ?? docs
 ?? examples
 ?? sources
    ?? libA
    ?   ?? include
    ?   ?   ?? libA
    ?   ?       ?? core.h
    ?   ?       ?? *.h
    ?   ?? source
    ?   ?   ??*.cpp
    ?? libB
        ?? include
        ?   ?? libB
        ?       ?? message.h
        ?       ?? *.h
        ?? source
            ?? *.cpp
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt几个地方有文件.主要的是在根目录中base,它设置了一堆变量和选项,最后调用add_subdirectory(sources).在sourcesCMakeLists.txt文件只是简单地调用:

add_subdirectory(libA)
add_subdirectory(libB)
Run Code Online (Sandbox Code Playgroud)

最后有CMakeLists.txt两个文件libAlibB目录.除目标名称外,它们大致相同.其中一个文件的示例是:

set(target libA)

# Sources
set(include_path "${CMAKE_CURRENT_SOURCE_DIR}/include/${target}")
set(source_path  "${CMAKE_CURRENT_SOURCE_DIR}/source")

# Add …
Run Code Online (Sandbox Code Playgroud)

c++ cmake

6
推荐指数
2
解决办法
2948
查看次数

安装CMake库:是否还为依赖项提供了查找模块?

我的CMake库MyLibrary具有一个依赖关系OtherLibrary,我可以使用非标准 库导入该库FindOtherLibrary.cmake

我的图书馆OtherLibrary公开依靠:

target_link_libraries(MyLibrary PUBLIC OtherLibrary::OtherLibrary)
Run Code Online (Sandbox Code Playgroud)

当我安装MyLibrary(与一起MyLibraryConfig.cmake),并且用户想要链接到它时,因此他们需要import OtherLibrary

是否有关于如何分配一个很好的做法FindOtherLibrary.cmake一起MyLibrary


理想情况下,如果其中包含类似以下内容,则可以从安装的配置文件中自动MyLibrary导入,从而使用户更轻松OtherLibraryMyLibraryConfig.cmake

include(CMakeFindDependencyMacro)
find_dependency(OtherLibrary)
Run Code Online (Sandbox Code Playgroud)

并且知道在哪里FindOtherLibrary.cmake是。

这是可能吗?

cmake

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

OpenMP 和 C++11 多线程

我目前正在从事一个混合高性能计算 (HPC) 和交互性的项目。
因此,HPC 部分依赖于 OpenMP(主要是具有大量相同计算的 for 循环),但它包含在具有 GUI 和多线程的更大框架中,目前使用 c++11 线程(std::threadstd::async)实现。

我已阅读OpenMP 与 C++ promises 和 futures 一起玩得好吗?以及为什么在使用嵌套的 OpenMP pragma 时 c++11 线程变得不可连接?混合使用 OpenMP 和 C++11 线程并不是一个好主意,但到目前为止它一直对我有用。
出于不同的原因,我想对此进行改进,但我不确定采用哪种策略。

OpenMP vs C++11 线程中,我读到std::thread由于线程的创建和销毁,替换 OpenMP对性能有相当大的影响,但我找不到任何关于通过基于任务的并行性替换 OpenMP 加速的内容std::async。在我看来,这应该比std::thread因为线程管理是由操作系统完成的要快,但我还不相信这是适用的。我还没有尝试过,因为它会涉及大量的重构,我希望先听听其他意见。

您有协调 HPC 和交互性的经验吗?在你眼里,应该std::async比 OpenMP 快吧?

c++ multithreading hpc openmp c++11

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

为什么CMake函数不能返回值?

关于CMake专家的一个问题.根据CMake 函数文档,函数根本不返回任何内容.要更改变量值,必须将其传递给函数,并在函数内部设置指定PARENT_SCOPE选项的新值.很好,这是CMake的一个众所周知的功能.

我的问题不是关于如何,而是关于为什么:为什么CMake函数不返回值?背后的想法是什么?例如,函数不能在if表达式中使用,也不能在set命令内部调用.如果我没记错的话,它与autotools是一样的,因此我认为这不是偶然的.

有专家知道为什么吗?

cmake

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

标签 统计

c++ ×4

cmake ×3

c++11 ×2

hpc ×1

inheritance ×1

move-semantics ×1

multithreading ×1

oop ×1

openmp ×1

qt ×1