在 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);
}
最佳答案
您可以做的一件事是指定方法 deleted
在 vec4
类中:
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/