小编Dmi*_*ich的帖子

无法使用各种lambda表达式初始化std :: variant

我正在玩,std::variant, lambdas并且std::future当我试图将它们组合在一起时得到超级奇怪的结果.以下是示例:

using variant_t = std::variant<
    std::function<std::future<void>(int)>,
    std::function<void(int)>
>;
auto f1 = [](int) { return std::async([] { return 1; }); };
auto f2 = [](int) { return std::async([] {  }); };

variant_t v1(std::move(f1)); // !!! why DOES this one compile when it SHOULDN'T?
auto idx1 = v1.index(); //equals 1. WHY?

variant_t v2(std::move(f2)); // !!! why DOESN'T this one compile when it SHOULD?
Run Code Online (Sandbox Code Playgroud)

这是编译错误:

错误C2665'std :: variant <std :: function <std :: future <void>(int)>,std :: function <void(int)>> …

c++ lambda future variant c++17

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

在Windows中以编程方式调用"main"函数

我有第三方控制台应用程序.我需要从我的应用程序运行它,但我不能将它作为一个单独的进程运行(因为我需要使用它的依赖项:手动填充导入表,设置挂钩等).所以我可能应该main手动调用此可执行文件的功能.这是我试图这样做的方式:

  1. 使用加载此EXE auto hMod = LoadLibrary("console_app.exe")
  2. 手动填写此exe的导入表
  3. 获取此EXE的入口点并调用它

我坚持到最后一步.

以下是我试图调用入口点的方法:

void runMain(HINSTANCE hInst)
{
    typedef BOOL(WINAPI *PfnMain)(int, char*[]);

    auto imageNtHeaders = ImageNtHeader(hInst);
    auto pfnMain = (PfnMain)(DWORD_PTR)(imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);

    char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
    pfnMain(3, args);
}
Run Code Online (Sandbox Code Playgroud)

有用.但它就好像没有争论一样.

我哪里错了?如何我的进程中使用参数运行可执行文件?谢谢.

更新:

我已经调查过我的特定第三方exe如何获取cmd参数并发现:

  1. 它根本不导入GetCommandLine,也不调用它
  2. 通过和之后可以通过call _initterm电话argcargv参数进行调查(见下图) cs:argccs:argv在此输入图像描述 在此输入图像描述
  3. 我传递给我的主控制台应用程序的CMD参数也会转移到子EXE.

您能解释一下,_initterm实际存在的CMD参数究竟存在了什么?

c++ program-entry-point systems-programming portable-executable entry-point

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

Lambda的"this"捕获返回垃圾

我正在实现我自己的类,它提供了其成员的延迟初始化.我this在lambda中遇到了一种奇怪的捕获行为.

这是一个再现此错误的示例.

//Baz.h
#include <memory>
#include <functional>
#include "Lazy.hpp"

struct Foo
{
    std::string str;

    Foo() = default;
    Foo(std::string str) : str(str) {}
    Foo(Foo&& that) : str(that.str) {  }
};

class Baz
{
    std::string str;

    Lazy<std::unique_ptr<Foo>> foo;

public:
    Baz() = default;
    Baz(const std::string& str) : str(str)
    {
        //lazy 'this->foo' initialization. 
        //Is capturing of 'this' valid inside ctors???.
        this->foo = { [this] { return buildFoo(); } };
    }
    Baz(Baz&& that) : foo(std::move(that.foo)), str(that.str) { }

    std::string getStr() const
    {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ lambda visual-c++ lazy-initialization c++11

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

预编译头文件的实际工作原理

我所有的问题都与 vc++ 编译器有关,但我猜其他 c++ 编译器具有相同的行为。

  1. 预编译头文件是与预处理器相关的内容还是与编译过程有关?或两者?我有几个猜测:
    • PCH 引擎只扩展 MACRO 定义和嵌套头并将它们转换为二进制格式(pch 文件)。在这种情况下,所有源文件(我的意思是 cpp/hpp 也可能包含在 PCH 中)将在项目中的每个源文件中重新编译。或不?
    • 所有源文件将只编译一次并拉入单个 obj 文件?例如,在这个例子中,变体库会被编译多少次?即只有一次 - 在 PCH 或两次 - 不是在 PCH 但在两个 *.cpp 文件中或三次 - 在 PCH 和两个 *.cpp 文件中?为什么?

//stdafx.h
#include <boost/variant/variant.hpp>

//test1.cpp
#include "stdafx.h"
#include <boost/variant/variant.hpp>
...

//test2.cpp
#include "stdafx.h"
...
Run Code Online (Sandbox Code Playgroud)
  1. 我应该在预编译头文件中放入哪些文件?我想这是在项目中随处使用并且很少改变的东西。图书馆怎么样,例如提升?我们只在少数源文件中使用 boost,我们应该把它放在 PCH 中吗?

c++ precompiled-headers visual-c++

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