考虑以下:
类B从类中公开继承A.两者都在库中提供,我无法修改它们.
我想实现一个Foo派生自的类B,但我想允许用户Foo只使用A和Foo(而不是B)的公共函数.对于他们来说,Foo继承自己是不相关的B,这原则上是我无法避免的实现细节.
因此,原则上我想Foo公开继承A,但私下来B.
是否有一些C++中的构造允许我这样做?
我必须补充说,虚拟继承不是一个选项,因为A在我的例子中,派生自QObject(如果QObject是直接派生的话,请参阅使用*virtual*multiple inheritance是否安全?).
(注意:对于感兴趣的人:就我而言,A是QWindow和B是Qt3DExtras::Qt3DWindow)
想象一下,我有一个A移动便宜且复制费用昂贵的课程.它可能看起来像
class A {
public:
[...]
private:
HeavyClass m;
};
Run Code Online (Sandbox Code Playgroud)
对于这个类,我想要一个静态验证,类(1)是可构造的,(2)不是简单地使用复制构造函数进行移动构造,而与是否显式声明移动构造函数无关.
这可能吗?
至于为什么我想这样做,请考虑以下示例:首先,该类自动生成移动构造函数,并根据需要运行.然后,有人更改了类并添加了析构函数,这导致不会隐式生成移动构造函数,而是使用复制构造函数.
因此,a static_assert会是理想的,但似乎这里没有is_move_constructible或is_trivially_move_constructible有帮助.
此外,我知道有可能拥有A(A&&) = default;所有这样的类,但是具有static_assert更清晰的解决方案并允许在类定义之外进行检查(在依赖于此类的其他项目中进行检查).
编辑:
我不想禁止复制构造,我只想确保移动构造函数不使用它...
这可能有点难以解释.我已经为我正在编写的一系列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).在sources该CMakeLists.txt文件只是简单地调用:
add_subdirectory(libA)
add_subdirectory(libB)
Run Code Online (Sandbox Code Playgroud)
最后有CMakeLists.txt两个文件libA和libB目录.除目标名称外,它们大致相同.其中一个文件的示例是:
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) 我的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是。
这是可能吗?
我目前正在从事一个混合高性能计算 (HPC) 和交互性的项目。
因此,HPC 部分依赖于 OpenMP(主要是具有大量相同计算的 for 循环),但它包含在具有 GUI 和多线程的更大框架中,目前使用 c++11 线程(std::thread和std::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 快吧?
关于CMake专家的一个问题.根据CMake 函数文档,函数根本不返回任何内容.要更改变量值,必须将其传递给函数,并在函数内部设置指定PARENT_SCOPE选项的新值.很好,这是CMake的一个众所周知的功能.
我的问题不是关于如何,而是关于为什么:为什么CMake函数不返回值?背后的想法是什么?例如,函数不能在if表达式中使用,也不能在set命令内部调用.如果我没记错的话,它与autotools是一样的,因此我认为这不是偶然的.
有专家知道为什么吗?