小编Xir*_*ema的帖子

如何编写一个"知道"自己的变量名的类

所以我想假设我有以下类定义:

class my_named_int {
public:
    int value;
    const string name;
    my_named_int(int _value, /*...Does Something Go Here...?*/);
};
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果我写下面的代码:

int main() {
    my_named_int my_name(5);
    std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

my_name:5
Run Code Online (Sandbox Code Playgroud)

显然,解决这个问题的最简单方法是编写如下代码:

class my_named_int {
public:
    int value;
    const string name;
    my_named_int(int _value, const string & _name);
};

int main() {
    my_named_int my_name(5, "my_name");
    std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,这会增加我的代码的重复性.有没有办法在没有变量名称的"双重写入"的情况下在C++中执行此操作,如果是这样,我将如何处理它?

c++

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

无法std :: bind成员函数

我写了以下课程:

class SomeClass {
private:
    void test_function(int a, size_t & b, const int & c) {
        b = a + reinterpret_cast<size_t>(&c);
    }
public:
    SomeClass() {
        int a = 17;
        size_t b = 0;
        int c = 42;
        auto test = std::bind(&SomeClass::test_function, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
        test(a, b, c);
    }
}
Run Code Online (Sandbox Code Playgroud)

就其本身而言,这段代码在IDE(Visual Studio 2015)中看起来很好,但是当我尝试编译它时,我收到以下错误:

Error   C2893   Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'    Basic Server    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits  1441    
Error   C2672   'std::invoke': no matching overloaded function found …
Run Code Online (Sandbox Code Playgroud)

c++ stdbind c++11

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

如何正确地与 GLFW 进行上下文共享?

我想要做的是,如果我用一个新窗口替换我正在渲染的窗口,这可能是因为用户切换屏幕,或从全屏切换到窗口,或出于任何其他原因。

到目前为止,我的代码如下所示:

“上下文.h”

struct window_deleter {
    void operator()(GLFWwindow * window) const;
};

class context {
    std::unique_ptr<GLFWwindow, window_deleter> window;
public:
    context(int width, int height, const char * s, GLFWmonitor * monitor, GLFWwindow * old_window, bool borderless);
    GLFWwindow * get_window() const;
    void make_current() const;
};
Run Code Online (Sandbox Code Playgroud)

“上下文.cpp”

context::context(int width, int height, const char * s, GLFWmonitor * monitor, GLFWwindow * old_window, bool borderless) {
    if (!glfwInit()) throw std::runtime_error("Unable to Initialize GLFW");
    if (borderless) glfwWindowHint(GLFW_DECORATED, 0);
    else glfwWindowHint(GLFW_DECORATED, 1);
    window.reset(glfwCreateWindow(width, height, s, monitor, old_window)); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glfw

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

如何扩展元组以匹配提供的参数?

我有一个功能(简化逻辑后)采取的形式

std::tuple<font_heap, font_heap> get_font_heaps(std::vector<uint8_t> const& a, std::vector<uint8_t> const& b) {
    return std::make_tuple(get_font_heap_from_data(a), get_font_heap_from_data(b));
}
Run Code Online (Sandbox Code Playgroud)

我想对这个函数进行模板化处理,以便它可以处理用户传入的数据集.

auto [serif, sansserif, monospace] = get_font_heaps(serif_data, sansserif_data, monospace_data);
auto [comic_sans] = get_font_heaps(comic_sans_data);
Run Code Online (Sandbox Code Playgroud)

我开始试图像这样重写逻辑:

template<typename ... FontDatas>
auto get_font_heaps(std::vector<uint8_t> const& data, FontData&& ...datas) {
    if constexpr(sizeof...(FontDatas) == 0) {
        return std::make_tuple(get_font_heap_from_data(data));
    else {
        return std::make_tuple(get_font_heap_from_data(data), get_font_heaps(std::forward<FontDatas>(datas)...);
}
Run Code Online (Sandbox Code Playgroud)

但很明显,即使这个编译,它也不能完全按照我想要的方式执行:它在表单中创建了一个嵌套的元组std::tuple<font_heap, std::tuple<font_heap, std::tuple<font_heap>>>,而我想要的std::tuple<font_heap, font_heap, font_heap>

我怎样才能重写这个逻辑来做我想做的事情?我正在使用MSVC 2017.3,因此我可以访问许多C++ 17功能,但不能访问Fold Expressions(我怀疑它会大大简化逻辑).

c++ c++11 stdtuple c++17

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

我无法更改片段着色器中的颜色

我正在学习OpenGL,我试图绘制一个红色三角形,但我的三角形保持黑色.

这是我的片段着色器的代码:

#version 330 core

out vec4 color;

void main()
{
    color = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)

我的着色器编译没有问题,我使用这个类来使用着色器:

public class ShaderProgram
{
    private final int programId;

    private int vertexShaderId;

    private int fragmentShaderId;

    public ShaderProgram() throws Exception
    {
        programId = glCreateProgram();
        if (programId == 0) {
            throw new Exception("Could not create Shader");
        }
    }

    public void createVertexShader(String shaderCode) throws Exception {
        vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
    }

    public void createFragmentShader(String shaderCode) throws Exception {
        fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
    }

    protected int createShader(String shaderCode, int …
Run Code Online (Sandbox Code Playgroud)

java opengl shader lwjgl

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

标签 统计

c++ ×4

c++11 ×2

opengl ×2

c++17 ×1

glfw ×1

java ×1

lwjgl ×1

shader ×1

stdbind ×1

stdtuple ×1