小编Phi*_*ang的帖子

模板中的C++默认参数不允许?

在我的C++代码中,我这样编写:

template <typename T, typename Pred>
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = std::less<T>())
{
    return p(lhs, rhs) ? lhs : rhs;
}
Run Code Online (Sandbox Code Playgroud)

但是当我打电话给BestOfTwo(3,5)时,这不起作用.编译器告诉我没有匹配的重载实例.所以现在我必须这样写:

template <typename T, typename Pred = std::less<T> >
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred())
{
    return p(lhs, rhs) ? lhs : rhs;
}
Run Code Online (Sandbox Code Playgroud)

当我打电话给BestOfTwo(3,5)时,这没有任何错误.但我认为之前的风格更方便,我也没想出它出错的地方.有什么建议吗?

c++

12
推荐指数
2
解决办法
1197
查看次数

glReadPixels获得的深度缓冲区始终为1

我正在使用glReadPixels来获取选择像素的深度值,但是我总是得到1,我该如何解决呢?这是代码:

    glEnable(GL_DEPTH_TEST);
    ..
    glReadPixels(x, viewport[3] - y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, z);
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?我的渲染部分如下所示。我使用不同的着色器绘制场景的不同部分,因此如何正确地从缓冲区读取深度值?

void onDisplay(void)
{
// Clear the window and the depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// calculate the view matrix.
GLFrame eyeFrame;
eyeFrame.MoveUp(gb_eye_height);
eyeFrame.RotateWorld(gb_eye_theta * 3.1415926 / 180.0, 1.0, 0.0, 0.0);
eyeFrame.RotateWorld(gb_eye_phi * 3.1415926 / 180.0, 0.0, 1.0, 0.0);
eyeFrame.MoveForward(-gb_eye_radius);
eyeFrame.GetCameraMatrix(gb_hit_modelview);
gb_modelViewMatrix.PushMatrix(gb_hit_modelview);

// draw coordinate system
if(gb_bCoord)
{
    DrawCoordinateAxis();
}

if(gb_bTexture)
{

    GLfloat vEyeLight[] = { -100.0f, 100.0f, 150.0f };
    GLfloat vAmbientColor[] = { 0.2f, 0.2f, 0.2f, 1.0f …
Run Code Online (Sandbox Code Playgroud)

opengl opengl-3

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

在painter程序中实现undo redo

我正在写一个画家程序,我想在其中实现基本操作的撤消和重做,如绘制线条,绘制椭圆等.
有没有好的方法呢?一项操作应包含哪些属性?
编辑:
其实我知道Command模式,但我想弄清楚的是,什么数据应该记录在Command对象中,以便完成撤消.

c++ graphics

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

如何在 CUDA 中自动计算 2D 图像的块和网格大小?

我已经知道 cuda 中块和网格的想法,我想知道是否有任何编写良好的辅助函数可以帮助我确定任何给定 2D 图像的最佳块和网格大小。

例如,对于此线程中提到的 512x512 图像。网格为 64x64,块为 8x8。

然而有时我的输入图像可能不是 2 的幂,它可能是 317x217 或类似的东西。在这种情况下,也许网格应该是 317x1 而块应该是 1x217。

因此,如果我有一个应用程序接受来自用户的图像,并使用 cuda 对其进行处理,它如何自动确定块和网格的大小和尺寸,用户可以在其中输入任何大小的图像。

是否有任何现有的帮助函数或类来处理这个问题?

parallel-processing cuda

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

c ++将初始化列表传递给函数作为参数将构造一个对象?

这是我的代码:

struct MyTest{
    int a;
    char b;
};
void testFunc(MyTest mt){
    cout << mt.a << mt.b << endl;
}
void main(){
    testFunc({ 1, 'c' });
}
Run Code Online (Sandbox Code Playgroud)

似乎mt将从 initializer_list 构造,testFunc将输出正确的结果.但是怎么可能因为我没有实现一个接受初始化列表的构造函数.

c++

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

不使用模板为用户定义的运算符调用隐式构造函数

在我的代码中,我实现了Vector3的模板,如下所示:

template <typename T>
struct TVector3{
    TVector3(const T& x, const T& y, const T& z);   // normal constructor from x,y,z
    TVector3(const T& val);   // construct from a constant value
    // .. other implementation
    T x, y, z;
};
// and my overload operator+ for TVector3
template <typename T>
const TVector3<T> operator+(const TVector3<T>& lhs, const TVector3<T>& rhs)
{
    return TVector3<T>(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z);
}
Run Code Online (Sandbox Code Playgroud)

我期待这样的调用: (1,2,3)+ 1 =(2,3,4),所以我这样写了:

TVector3<float> v(1, 2, 3);
v + 1.0f; …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

标签 统计

c++ ×4

cuda ×1

graphics ×1

opengl ×1

opengl-3 ×1

parallel-processing ×1

templates ×1