小编Flu*_*ffy的帖子

Visual Studio 中的 CMake MFC 项目缺少资源编辑器

我很难在 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 <...>\n
Run Code Online (Sandbox Code Playgroud)\n

顶级 CMakeLists.txt:

\n
cmake_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)\n
Run Code Online (Sandbox Code Playgroud)\n

源代码CMakeLists.txt:

\n
include_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 .)\n
Run Code Online (Sandbox Code Playgroud)\n

在 Visual Studio (Pro) …

mfc cmake visual-studio visual-c++

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

C++ API设计:使用void*一个坏主意?

我正在研究一个我希望在调用者方面尽可能通用的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是作为在运行时加载的共享库提供的.所以任何编译时耦合(以及代码生成,除非我弄错了)都不在桌面上

谢谢!

c++ api-design c++11

5
推荐指数
2
解决办法
345
查看次数

将整数序列与元组和可变参数模板一起使用

假设我有一个元组:

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

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

迭代std :: variant的映射

我正在尝试使用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)

c++ variant c++17

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