小编RnM*_*Mss的帖子

C++ 11 STL中的所有内容都是用户可实现的吗?

我知道libs喜欢<map>,<vector>并且<algorithm>即使它们不存在于标准库中也可以由用户实现.

但是C++ 11 STL中的某些类或函数只是"编译器 - 魔法",无法手动实现吗?


编辑 由STL,我的意思是标准模板库,不需要额外的链接.

c++ c++11

31
推荐指数
3
解决办法
1855
查看次数

在Visual Studio中,与std :: async一起使用时未调用`thread_local`变量'析构函数,这是一个错误吗?

以下代码

#include <iostream>
#include <future>
#include <thread>
#include <mutex>

std::mutex m;

struct Foo {
    Foo() {
        std::unique_lock<std::mutex> lock{m};
        std::cout <<"Foo Created in thread " <<std::this_thread::get_id() <<"\n";
    }

    ~Foo() {
        std::unique_lock<std::mutex> lock{m};
        std::cout <<"Foo Deleted in thread " <<std::this_thread::get_id() <<"\n";
    }

    void proveMyExistance() {
        std::unique_lock<std::mutex> lock{m};
        std::cout <<"Foo this = " << this <<"\n";
    }
};

int threadFunc() {
    static thread_local Foo some_thread_var;

    // Prove the variable initialized
    some_thread_var.proveMyExistance();

    // The thread runs for some time
    std::this_thread::sleep_for(std::chrono::milliseconds{100}); 

    return 1;
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading memory-leaks visual-studio

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

顶点着色器如何将颜色信息传递给片段着色器?

在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.

但是当我使用这样的着色器时:

顶点着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)

其中的属性aVertexaColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.

片段着色器:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)

三角形仍然充满了渐变,这里有一个问题:

如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.

那么渐变来自哪里?

或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?

opengl shader glsl

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

为什么我的OpenGL版本在Mac OS X上总是2.1?

我在Mac OS X 10.8上使用GLFW 3.0,显卡是Intel HD Graphics 5000

我的OpenGL API版本是2.1,获得者

glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
Run Code Online (Sandbox Code Playgroud)

编译选项:

g++ ... -framework OpenGL -framework Cocoa -framework IOKit ...
Run Code Online (Sandbox Code Playgroud)

头:

#include <GLFW/glfw3.h>
#include <GL/glu.h>
Run Code Online (Sandbox Code Playgroud)

版本总是2.1,与报告的3.2不同.

https://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1085_Core.html

...

现在我的操作系统已经升级到10.9,OpenGL版本仍然是2.1.

它仍然无法编译GLSL 3.3,而Apple表示它支持4.1.

https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html

我怎样才能使它工作?

opengl macos glfw

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

C++20 概念语法 - requires 参数变量是什么意思?

很多文章都给出了这样的例子:

template<typename T>
concept Equal = requires(T a, T b) {
    { a == b } -> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud)

如果我写:

template<typename T>
concept Equal = requires(T a) {
    { a == a } -> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud)

如果不是,为什么语法是这样设计的?为什么他们要我声明这些变量,如ab

为什么我需要多个相同类型的变量?为什么我什至需要变量?

template<typename T>
concept Equal = requires {
    { declval<const T&>() == declval<const T&>() }
        -> std::same_as<bool>;
};
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

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

为什么使用本地struct作为STL函数参数的代码不能用g ++编译?

我有这样的代码,效果很好:

#include <algorithm>
#include <iostream>

char x[11]= "ABCDEFGHIJ";
char y[11];

struct F {
    char operator () (char c) const 
    { return c+1; }
};

int main()
{
    std::transform(x, x+10, y, F());
    y[10] = 0; std::cout <<y <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为此样式:

#include <algorithm>
#include <iostream>

char x[11]= "ABCDEFGHIJ";
char y[11];

int main()
{
    struct F {
        char operator () (char c) const 
        { return c+1; }
    };
    std::transform(x, x+10, y, F());
    y[10] = 0; std::cout <<y <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它不会编译,说:

错误:没有匹配函数来调用'transform(char [11],char*,char [11],main():: …

c++ templates stl g++ c++11

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

更简单的替代库到Reactive?(Haskell的)

我正在学习Haskell,并尝试编写一些事件驱动的程序.

以下代码来自教程:http://www.haskell.org/haskellwiki/OpenGLTutorial2

main = do
  (progname,_) <- getArgsAndInitialize
  initialDisplayMode $= [DoubleBuffered]
  createWindow "Hello World"
  reshapeCallback $= Just reshape
  angle <- newIORef (0.0::GLfloat)          -- 1
  delta <- newIORef (0.1::GLfloat)          -- 2
  position <- newIORef (0.0::GLfloat, 0.0)  -- 3
  keyboardMouseCallback $= Just (keyboardMouse delta position)
  idleCallback $= Just (idle angle delta)
  displayCallback $= (display angle position)
  mainLoop
Run Code Online (Sandbox Code Playgroud)

状态存储在IORefs中,这使得它看起来就像命令式语言.

我听说除了这个之外还有其他API Graphics.UI.GLUT,(例如Reactive),但它看起来非常复杂.

我的方法是lib提供一个函数runEventHandler,用户编写一个handler接受Events 列表并将其转换为IO ().

handler :: [Event] …
Run Code Online (Sandbox Code Playgroud)

architecture haskell frp

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

Node.js 可以使用另一个文件名作为目录索引文件,而不是“index.js”吗?

当我们写作时require('some/directory')

它将查找some/directory/index.js是否some/directory是一个目录。

但是如果我想使用另一个文件名,例如 ,该怎么办_index.js?(因此它可以在目录树中的同级文件之前排序。)

node.js

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

Emscripten:自定义生成的 js,以便以自定义方式加载 .wasm 文件

通过使用以下选项进行编译,

emcc -s WASM=1 main.cpp -o index.js

emscripten 生成一个index.wasm, 和一个 js 包装器index.js。js 包装器在浏览器中运行时加载.wasm位于同一目录中的文件。XMLHttpRequest

那么如果我需要手动加载文件该怎么办呢.wasm?加载部分似乎是硬编码在包装器中的。

以下是我需要这样做的一些情况:

  • 我需要.wasm从另一个 url(例如从 CDN)提供该文件。
  • 下载文件的 url.wasm是动态生成的。
  • 代码在XMLHttpRequest不允许的沙箱中运行,只有像getMyData('some_file').
  • 我需要将所有文件嵌入为 base64 字符串。

.wasm我知道我只能通过以下方式生成文件

emcc -s WASM=1 main.cpp -o index.wasm

但随后我丢失了包装器,这在使用 SDL 和 GLES 等 emscripten API 时并非易事。

javascript emscripten webassembly

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

如何正确关闭用 fdopen 打开的套接字?

我有一个插座sock

int sock = socket(...);
connect(sock, ...);
 // or sock = accept(sock_listen, 0, 0);
Run Code Online (Sandbox Code Playgroud)

并且我用 fdopen 打开了两次,这样我就可以使用缓冲的读取器和写入器stdio,例如fwritefreadfgetsfprintf

FILE *f_recv = fdopen(sock, "wb");
FILE *f_send = fdopen(sock, "rb");

// some IO here.

close(sock);
fclose(f_recv);
fclose(f_send);
Run Code Online (Sandbox Code Playgroud)

但是我们知道,如果我fclose是一个文件,aclose将随后被调用,并且fclose会失败。

如果我只使用close, struct 的内存FILE就会泄漏。

我该如何正确关闭它?


更新:

使用fdopen一次"r+"使读写共享同一个锁,但我除了发送和接收单独工作。

c c++ sockets posix glibc

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