c++ - 如何在 C++ 编译器不智能的情况下实现 GLSL vec* 构造语法?

标签 c++ syntax constructor syntax-error glsl

GLSL 中,我们可以做到这一点

vec4 v = vec4(vec3(10.f, 20.f, 30.f), 1.f);

所以我试着用C++来做

struct vec3
{
    float x, y, z;
    vec3(){}
    vec3(float all) : x(all), y(all), z(all) {}
    vec3(float a, float b, float c) : x(a), y(b), z(c){}
};

struct vec4
{
    float x, y, z, w;
    vec4() {}
    vec4(float all) : x(all), y(all), z(all), w(all) {}
    vec4(float a, float b, float c, float d) : x(a), y(b), z(c), w(d) {}
    // Here is the trick
    vec4(vec3 v3, float d) : x(v3.x), y(v3.y), z(v3.z), w(d) {}
};

它有效,但问题是我只能用两个 float 初始化vec4...似乎编译器替换了vec4(a, b); 在编译时使用 vec4(vec3(a), b); 这是我想要的,因为它令人困惑和不需要,我会更有可能抛出错误,但如何抛出错误?

int main()
{
    vec3 V3 = vec3(10.f, 20.f, 30.f);
    vec4 V4;
    // Works
    V4 = vec4(V3, 1.f);
    // This also works which is a problem.
    V4 = vec4(10.f, 1.f); // == vec4(vec3(10.f), 1.f);
}

最佳答案

您可以做的一件事是指定方法 deletedvec4 类中:

vec4(float a, float b) = delete;

然后,如果您尝试创建一个包含两个数字的 vec4,它只会提示尝试使用已删除的方法。

a.cpp: In function ‘int main()’:
a.cpp:27:24: error: use of deleted function ‘vec4::vec4(float, float)’
V4 = vec4(10.f, 1.f); // == vec4(vec3(10.f), 1.f);

当然报错信息不是最好的,但至少会报错,不会隐式转换。


另一种提供更好的错误消息但可能会改变其他地方的功能的方法是将 vec3 的构造函数指定为 explicit .这意味着不允许编译器将 float 隐式转换为 vec3:

explicit vec3(float all) : x(all), y(all), z(all) {}

这会导致以下错误:

a.cpp:26:24: error: no matching function for call to ‘vec4::vec4(float, float)’
V4 = vec4(10.f, 1.f); // == vec4(vec3(10.f), 1.f);

a.cpp:16:5: note: candidate: vec4::vec4(vec3, float) vec4(vec3 v3, float d) : x(v3.x), y(v3.y), z(v3.z), w(d) {}

a.cpp:16:5: note: no known conversion for argument 1 from ‘float’ to ‘vec3’

所以很清楚为什么会发生这个错误,但是如果在某个时候你想进行隐式转换,这当然是不允许的。

关于c++ - 如何在 C++ 编译器不智能的情况下实现 GLSL vec* 构造语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52069913/

相关文章:

c++ - 如何统计循环发生的次数?

C++ 基类函数在子类中重载

c++ - 如何让模板推导其参数

javascript - '&&' and ' | |' vs ' ? :'

java - GUI 未显示在我的屏幕上

Javascript:重写子类中继承的方法后如何运行父类的构造函数逻辑?

c++ - 双线性插值正弦图像失真 C++

Java 被这种语法搞糊涂了

python - 如何以方便的数学方式输入公式来绘制矢量场?

c++ - Java程序员——C++人如何使用类?指向类的指针,默认参数?