gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:18:31 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com