小编Veg*_*ard的帖子

为什么gcc使用我的自定义迭代器优化了这个C++ 11 foreach循环?

我试图编写一些代码来进行序列的功能式创建.我编写了一个函数,range(a, b)它返回一个可以迭代的对象,foreach-style,遍历数字a,a + 1,...,b - 1.然后我写了另一个函数map(f, t),它返回另一个函数对象,其中序列中的每个元素都是f使用可迭代对象的相应元素进行调用的结果t.

如果我使用-O1或更低编译,这可以按预期工作; 有了-O2或更高,我的foreach循环(在main底部)得到完全优化,没有任何打印.为什么会这样,我做错了什么?这是我的代码:

template<typename T>
struct _range {
    T a;
    T b;

    _range(T a, T b):
        a(a),
        b(b)
    {
    }

    struct iterator {
        T it;

        iterator(T it):
            it(it)
        {
        }

        bool operator!=(const iterator &other) const
        {
            return it != other.it;
        }

        void operator++()
        {
            ++it;
        }

        T operator*() const
        {
            return it;
        }
    };

    iterator begin() const
    {
        return iterator(a); …
Run Code Online (Sandbox Code Playgroud)

c++ foreach iterator c++11

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

如何从'change'信号处理程序更改urwid.Edit的文本?

我想从其"更改"信号处理程序中更改urwid.Edit的文本.但是,它没有做任何事情.最小的工作示例:

import urwid

input_line = urwid.Edit(multiline=True)

def input_change(widget, text):
        if text.endswith("\n"):
                input_line.set_edit_text('')

urwid.connect_signal(input_line, 'change', input_change)
urwid.MainLoop(urwid.Filler(input_line)).run()
Run Code Online (Sandbox Code Playgroud)

如果按Enter键,它实际上会调用.set_edit_text(),但文本保持不变.我如何实现我想要的目标?

python urwid

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

如何将 2D 变换矩阵(对于齐次坐标)转换为 z=0 平面中的 3D 矩阵?

我有一个 2D 齐次坐标的 3x3 变换矩阵:

a b c
d e f
g h i
Run Code Online (Sandbox Code Playgroud)

我想glMultMatrix在 2D 应用程序中将其传递给 OpenGL(使用 ),但 OpenGL 采用 4x4 矩阵作为 3D 齐次坐标。我希望 4x4 矩阵转换的所有坐标最终都为 和 ,xy3x3 矩阵和 相同z=0

我已经尝试解决了。对于一个向量,x, y, 1我最终会得到转换后的向量ax + by + c, dx + ey + f, gx + hy + i,所以这意味着对于一个向量x, y, 0, 1,我希望得到转换后的向量ax + by + c, dx + ey + f, 0, ?。可以做到这一点的一个矩阵是(据我所知):

a b …
Run Code Online (Sandbox Code Playgroud)

opengl matrix coordinates homogenous-transformation coordinate-transformation

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

在C++中,如何在没有new的情况下创建`std :: initializer_list <base*>`而不单独声明单个元素?

在C++中,您可以在文件范围内声明某个数组:

static foo a[] = { foo(), foo(), foo() };
Run Code Online (Sandbox Code Playgroud)

各个foo对象具有静态存储(即它们不在运行时分配).

如果我有一个由两个或多个派生类继承的基类,则由于切片,以下内容将编译但不能按预期工作:

static base a[] = { derived1(), derived2() };
Run Code Online (Sandbox Code Playgroud)

这样的事情不应该导致切片发生:

static derived1 d1;
static derived2 d2;
static base *a[] = { &d1, &d2 };
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在不必为单个(指向)元素保持静态存储的情况下进行声明d1d2分离a,并且如何进行相同的操作?以下给出了"获取临时"错误的地址:

static base *a[] = { &derived1(), &derived2() };
Run Code Online (Sandbox Code Playgroud)

也许可以定义一个constexpr可变参数模板函数?就像是:

template<typename... Args>
constexpr std::initializer_list<base *> base_array(Args... args) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后我可以写:

static base *a[] = base_ptr_array(derived1(), derived2());
Run Code Online (Sandbox Code Playgroud)

也许这会有同样的"暂时解决"问题,虽然我的想法是因为这是一个constexpr,它的工作方式与{ foo(), foo(), foo() }上面类似(不会产生临时性).

c++ inheritance templates initialization initializer-list

4
推荐指数
2
解决办法
84
查看次数

当GLEW_ARB_framebuffer_object为非零时,为什么glFramebufferTexture为空指针?

我的代码看起来大致如下:

GLenum glewStatus = glewInit();
if (glewStatus != GLEW_OK)
    exit(1);

if (!GLEW_ARB_framebuffer_object)
    exit(1);

printf("%p\n", glFramebufferTexture);
Run Code Online (Sandbox Code Playgroud)

这打印0,这解释了为什么glFramebufferTexture()立即调用segfaults.

但是,为什么是0?很多其他的帧缓冲功能都工作得很好(例如glBindFramebuffer,glFramebufferRenderbufferglBindFramebuffer).

我是否需要以不同的方式初始化GLEW或扩展名?

linux opengl glew

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