我很难在 MFC CMake 项目中打开交互式资源编辑器,否则该项目可以正常编译和运行。
\n项目文件的布局如下:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 inc\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 <...>\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 resource.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 res\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 MyApp.ico\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 MyApp.rc\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 MyApp.rc2\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 <...>\nRun Code Online (Sandbox Code Playgroud)\n顶级 CMakeLists.txt:
\ncmake_minimum_required(VERSION 3.5)\nproject(MyProject)\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\nset(CMAKE_CXX_STANDARD 14)\nif (MSVC)\n set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /we4715") # makes missing return as error\n set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # parallel build\nendif()\nset(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/output)\n\n# MFC\nadd_definitions(-D_AFXDLL)\nset(CMAKE_MFC_FLAG 1)\n\nadd_subdirectory(src)\nRun Code Online (Sandbox Code Playgroud)\n源代码CMakeLists.txt:
\ninclude_directories(${CMAKE_SOURCE_DIR}/inc)\ninclude_directories(${CMAKE_SOURCE_DIR}/res)\ninclude_directories(${CMAKE_SOURCE_DIR})\n\nset(SOURCES\n <...>\n )\n\nset(HEADERS\n <...>\n )\n\nadd_executable(\n ${PROJECT_NAME}\n WIN32 \n ${SOURCES}\n ${HEADERS}\n ${CMAKE_SOURCE_DIR}/res/MyApp.rc\n ${CMAKE_SOURCE_DIR}/res/MyApp.rc2\n )\n\ninstall(TARGETS MyApp\n RUNTIME DESTINATION .)\nRun Code Online (Sandbox Code Playgroud)\n在 Visual Studio (Pro) …
我正在研究一个我希望在调用者方面尽可能通用的API.主要设计思想是提供信号/插槽类型的实现,允许API的用户订阅一组给定的事件,并将用户定义的回调附加到它们.
公共接口看起来像这样
RetCallback subscribe(EventEnum& ev, std::function<void(void*)> fn) const;
::注意void(void*)这里的签名.EventEnum在公共头文件中给出,以及类型定义.
然后,API的内部工作将通过notify方法通知其订阅的事件观察者,并提供数据以转发给客户端:
void dummyHeavyOperation() const {
std::this_thread::sleep_for(2s);
std::string data = "I am working very hard";
notify(EventEnum::FooEvent, &data);
}
Run Code Online (Sandbox Code Playgroud)
客户端订阅并将数据转换为(文档化)类型,如下所示:
auto subscriber = Controller->subscribe(EventEnum::FooEvent, callback);
Run Code Online (Sandbox Code Playgroud)
哪里
void callback(void* data) {
auto* myData = (std::string*) data;
std::cout << "callback() with data=" << *myData << std::endl;
/// Do things
}
Run Code Online (Sandbox Code Playgroud)
这是一个合理的设计还是不赞成?您经验丰富的现代C++开发人员的想法告诉您什么?
[编辑]
我还应该补充说,API是作为在运行时加载的共享库提供的.所以任何编译时耦合(以及代码生成,除非我弄错了)都不在桌面上
谢谢!
假设我有一个元组:
std::tuple<int, char, unsigned int> t{1, 'a', 4}
Run Code Online (Sandbox Code Playgroud)
如何使用std::index_sequence和朋友迭代上述元组的类型,以便可以使用(或在需要时重写)以下函数to_token?
template<typename P1, typename... Param>
std::vector<std::string> to_token(const P1& p1, const Param&... param) {
const auto to_token_impl = [](const auto& t) {
using ParamType = std::decay_t<decltype(t)>;
std::stringstream ss;
if constexpr (std::is_same_v<ParamType, char>)
ss << "char";
else if constexpr (std::is_integral_v<ParamType>) {
ss << "integral";
}
return ss.str();
};
return {to_token_impl(p1), to_token_impl(param)...};
}
Run Code Online (Sandbox Code Playgroud)
预期产量: { "integral", "char", "integral" }
根据此处找到的示例,我已经开始研究这种间接方式,但是我无法确定下一步该怎么做...
template<typename... Args>
void tokenize(const std::tuple<Args...>& t) {
tokenize_impl(t, std::index_sequence_for<Args...>{}); …Run Code Online (Sandbox Code Playgroud) c++ tuples template-meta-programming variadic-templates c++17
我正在尝试使用C++ 17的std :: variant来在地图中存储多种类型的数据.这里的用例是有一个泛型类型的控制器映射(但绑定std::variant),我可以迭代并调用方法.在下面的例子中,
#include <iostream>
#include <map>
#include <variant>
class ControlA {
public:
void specificToA() { std::cout << "A" << std::endl; }
};
class ControlB {
public:
void specificToB() { std::cout << "B" << std::endl; }
};
template<typename T>
class ControlItem{
T* control;
public:
ControlItem() = default;
~ControlItem() = default;
void doStuff() {
if constexpr (std::is_same_v<T, ControlA>) {
control->specificToA();
}
if constexpr (std::is_same_v<T, ControlB>) {
control->specificToB();
}
}
};
class MyClass {
public:
void cycleThroughMap(); …Run Code Online (Sandbox Code Playgroud)