天道酬勤,学无止境

c++

Second overload of std::foward (example on cppreference.com)

问题 我知道std::forward的第二个重载: template< class T > constexpr T&& forward( std::remove_reference_t<T>&& t ) noexcept; 用于右值(如 Howard Hinnant 在他的回答中所述:如何 std::forward 接收正确的参数?) 在 cppreference.com 上使用此重载时有一个示例(Praetorian 的 How does std::forward receive the correct argument? 中也提到了这一点): 将右值作为右值转发并禁止将右值作为左值转发 此重载使得可以将表达式(例如函数调用)的结果(可能是右值或左值)转发为转发引用参数的原始值类别。 例如,如果包装器不只是转发它的参数,而是在参数上调用一个成员函数,并转发它的结果: // transforming wrapper template<class T> void wrapper(T&& arg) { foo(forward<decltype(forward<T>(arg).get())>(forward<T>(arg).get())); } arg 的类型可能在哪里struct Arg { int i = 1; int get() && { return i; } // call

2022-07-11 09:55:13    分类:技术分享    c++   c++11   perfect-forwarding

OpenGL doesn't seem to be reading my vertices/indices

问题 我一直在学习本教程以学习 OpenGL。 我有一些有用的东西,但前提是我使用全局变量: #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> // float vertices[] = { // -0.5f, -0.5f, 0.0f, // 0.5f, -0.5f, 0.0f, // 0.0f, 0.5f, 0.0f // }; float rectVertices[] = { 0.5f, 0.5f, 0.0f, // Top Right 0.5f, -0.5f, 0.0f, // Bottom Right -0.5f, -0.5f, 0.0f, // Bottom Left -0.5f, 0.5f, 0.0f // Top Left }; uint rectIndices[] = { 0, 1, 3, // First Triangle 1, 2, 3 // Second Triangle }; const GLchar* vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "void main() {\n" "gl_Position = vec4(position.x

2022-07-11 09:47:42    分类:技术分享    c++   pointers   opengl

Why must I cast a `uint8_t` to `uint64_t` *before* left-shifting it?

问题 我只想将我的 uint8_t 数组连接到 uint64_t。 事实上,我解决了我的问题,但需要了解原因。 这是我的代码; uint8_t byte_array[5]; byte_array[0] = 0x41; byte_array[1] = 0x42; byte_array[2] = 0x43; byte_array[3] = 0x44; byte_array[4] = 0x45; cout << "index 0: " << byte_array[0] << " index 1: " << byte_array[1] << " index 2: " << byte_array[2] << " index 3: " << byte_array[3] << " index 4: " << byte_array[4] << endl; /* This does not work */ uint64_t reverse_of_value = (byte_array[0] & 0xff) | ((byte_array[1] & 0xff) << 8) | ((byte_array[2] & 0xff) << 16) | ((byte_array[3] & 0xff) << 24) | ((byte_array[4] & 0xff) << 32); cout << reverse

2022-07-11 09:45:30    分类:技术分享    c++

Struct initialization of derived struct with a templated base type [duplicate]

问题 这个问题在这里已经有了答案: 为什么我不能大括号初始化从另一个结构派生的结构? (4 个回答) 6年前关闭。 我正在尝试对从模板结构派生的结构初始化。 代码是这样的: template <class Derived> struct Event{ //the level of access on the ctor has nothing to do with the problem //protected: // Event() = default; }; struct MoveEvent: Event<MoveEvent>{ int x, y; }; int main(){ //how do I make this work? //MoveEvent event = {.x =5, .y = 4}; } 我认为这可能与 CTRP 有关,但将Event<MoveEvent>更改为Event<int>会产生同样的问题。 此外,我认为这是 POD 的问题,但std::is_pod MoveEvent true 。 那么这里有什么问题呢? 为什么我不能使用结构初始化? 回答1 您只能对聚合进行聚合初始化。 聚合来自 [dcl.init.aggr]: 聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第

2022-07-11 09:45:04    分类:技术分享    c++   c++11

How to use decltype with member functions

问题 我正在尝试在 Visual Studio 2012 的成员函数上使用 decltype。我偶然发现了一个特性,我想知道这是有意还是编译器错误。 考虑(只是一个代码片段,无意表明我的观点): struct Test { int f() {return 0;} } T; std::integral_constant<decltype(T.f()), 5>; std::integral_constant<decltype(&Test::f), 5>; // error C2440 当第二行编译时,第三行给出错误 C2440: 'specialization' : cannot convert from 'int' to 'int (__thiscall Test::*)(void)' 对函数的实例化调用中的 decltype 如何产生其返回类型(这是我所期望的),但是在不涉及任何成员的情况下尝试做同样的事情会产生成员函数指针? 如果这是预期的行为,其背后的原因是什么? 我如何表示我正在请求成员函数的返回类型,而实际上手头没有实例? 当然我可以用肮脏的方式来做: std::integral_constant<decltype(((Test*)nullptr)->f()), 5>; 但毫无疑问,这很漂亮,很丑陋,应该有一种干净、直接的 C++ 方式来表达这一点。 回答1 &Test

2022-07-11 09:45:00    分类:技术分享    c++   function   instance   member   decltype

C++ libcurl http response code issues

问题 这个问题/怪癖/副作用让我发疯。 在代码底部附近,HTTP 交互的响应代码通过引用传递到 responseCode_。 然而,即使该站点可以以其他方式访问,它也经常显示为 0,并且返回太快而无法超时...... 所有变量都已定义,下面的代码只是类中 C++ 方法的片段。 任何 var_ 变量都是基于实例的。 它在多个线程上运行,但这应该不是问题。 每个使用 libcurl 的类在各自的线程上都有自己的实例。 提前感谢您的任何想法或建议... CURL *curl; curl = curl_easy_init(); //The URL curl_easy_setopt(curl, CURLOPT_URL, url.getURLString().c_str()); //Timeout curl_easy_setopt(curl, CURLOPT_TIMEOUT, &timeout_); //disable signals to use with threads curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //Redirecting curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); /

2022-07-11 09:44:39    分类:技术分享    c++   http   response   libcurl

Very large array - C array vs C++ array. Visual Studio - exceeds max (268435456)

问题 我正在尝试创建一个非常大的数组,然后我得到以下错误。 char largearray[1744830451]; 警告 LNK4084:总图像大小 1750372352 超过最大值(268435456); 图像可能无法运行 有人告诉我可以使用 C-array 而不是 C++ 。 我不确定我是否完全理解我朋友的反应。 我目前正在使用 Visual Studio 6.0 C++ 。 我是否需要让另一个编译器直接执行 C 语言,或者它是一种如何声明需要更改的数组的方法? 如果我需要更改编译器,有人有建议吗? 回答1 char array[size]语法意味着该数组将在已编译程序的数据部分中创建,而不是在运行时分配。 Win32 PE 代码不能超过 256MB(根据链接器的错误消息),但您声明的数组长度为 1.6GB。 如果你想要一个 1.6GB 的数组,请使用malloc (不要忘记调用free !) ...但是你到底为什么要运行 VC6? 回答2 如果您预先定义了大小,那么您将被限制为堆栈大小(堆栈大小较小但速度更快),因此最好动态定义大小,这意味着您的数据存储在堆中(堆大小较大但有点比堆栈慢)。 看看 http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html,它解释了堆栈和堆的区别。

2022-07-11 09:44:31    分类:技术分享    c++   c   arrays   visual-studio-6

Incremental build with GCC and manual makefile?

问题 我在 Eclipse 中使用 GCC 和我自己维护的 makefile 对 NRF51822 蓝牙芯片进行编码。 我的问题是,每次我按 build 时,它都会编译所有内容,这开始需要相当长的时间。 我在创建和维护make-files方面没有那么有经验,所以我不知道从哪里开始才能让它构建增量? 我的makefile是这样组成的(我知道有很多,而且我自己还没有创建它-在教程中找到了它,所以我不知道什么是相关的,什么不是:-)): PROJECT_NAME := my_project export OUTPUT_FILENAME #MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) MAKEFILE_NAME := $(MAKEFILE_LIST) MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) TEMPLATE_PATH = nrf51_sdk/toolchain/gcc ifeq ($(OS),Windows_NT) include $(TEMPLATE_PATH)/Makefile.windows else include $(TEMPLATE_PATH)/Makefile.posix endif MK := mkdir RM := rm

2022-07-11 09:44:04    分类:技术分享    c++   eclipse   gcc   makefile   nrf51

Incremental build with GCC and manual makefile?

问题 我在 Eclipse 中使用 GCC 和我自己维护的 makefile 对 NRF51822 蓝牙芯片进行编码。 我的问题是,每次我按 build 时,它都会编译所有内容,这开始需要相当长的时间。 我在创建和维护make-files方面没有那么有经验,所以我不知道从哪里开始才能让它构建增量? 我的makefile是这样组成的(我知道有很多,而且我自己还没有创建它-在教程中找到了它,所以我不知道什么是相关的,什么不是:-)): PROJECT_NAME := my_project export OUTPUT_FILENAME #MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) MAKEFILE_NAME := $(MAKEFILE_LIST) MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) TEMPLATE_PATH = nrf51_sdk/toolchain/gcc ifeq ($(OS),Windows_NT) include $(TEMPLATE_PATH)/Makefile.windows else include $(TEMPLATE_PATH)/Makefile.posix endif MK := mkdir RM := rm

2022-07-11 09:42:40    分类:技术分享    c++   eclipse   gcc   makefile   nrf51

Return Array of object from ATL ActiveX Control

问题 回答1 您返回一个安全数组或 - 我的偏好 - 一个保存安全数组的变量值,例如变量数组。 这在各种 ActiveX 宿主环境中得到了很好的认可,包括脚本语言。 如何在 ATL COM 中创建变体数组并传回 VB 使用 COM 传递数组从 ATL 服务器返回 VARIANT 数组带有变体数组 [out] 参数的 atl 对象不适用于 vbscript 将数组传入/传出自定义 activex 函数将 VARIANT 从 COM 编组回 C++ 客户端

2022-07-11 09:39:54    分类:技术分享    c++   com   mfc   activex