[英]Imitate OpenCL float2 type in C++
在OpenCL C99中,我们可以编写这个来创建一个'float2'的新实例:
float f = (float2)(1.f, 2.f);
我的问题是我需要在C ++中使用EXACT SAME代码,为此我创建了一个新类float2,但似乎在这种情况下不调用以下运算符:
inline float2 operator()(const float a, const float b) { return float2(a, b); }
有人有解决方案的想法吗?
继jprice的评论之后 ,如果你可以改变你的OpenCL代码的语法,你可以通过在C ++代码中定义一个简单的struct
来使这两种语言都能工作:
struct float2 {
float x, y;
// define operators here
};
然后你可以这样做,而不是使用上面的“cast-style”语法:
float2 f;
f.x = 1.f; f.y = 2.f;
哪个都适用。
我不相信这是可能的。 行float2 f = (float2)(1.f, 2.f);
可以用两种方式解释:
float2
是一个类型,则将(1.f, 2.f)
的结果(1.f, 2.f)
使用逗号运算符的表达式,返回float
)转换为float2
。 由于没有从float
到float2
,因此失败。 float2
是函数/函子,则使用提供的两个参数执行func2
。 使用前面的解释,我们可以尝试像你尝试的那样添加转换运算符,这必须是从float
到float2
的转换,因为(1.f, 2.f)
的结果是float
(2.f) 。 我们无法访问此转换中的第一个参数(在逗号运算符之后丢失),因此这不会让我们无处可去。
使用后者的解释,我们可以写下以下内容:
detail::float2 float2(float x, float y)
{
detail::float2 result(x, y);
return result;
}
int main(int argc, char **argv)
{
detail::float2 f = (float2)(1.f, 2.f);
return 0;
}
请注意,我将float2
结构(为简洁起见而省略)放在名为detail
的名称空间中,这对于解决在同一名称空间中同时具有名为float2
的类型和函数所导致的歧义是必要的。 可悲的是,我认为没有办法解决这个问题,而且这是我们能得到的最接近的。 但是,您无法在OpenCL和C ++中使用完全相同的代码。
标准库包含一个标题<complex>
,它定义了一个模板std::complex
dessigned,用于执行具有复数的算术计算。
复数表示为浮点值对(实部和虚部),因此可用于模拟float2
类型。
如果您定义了一个别名float2
您可以通过C样式转换模拟您的确切语法 :
#include <complex>
typedef std::complex<float> float2;
int main()
{
float2 f = (float2)(1.0,2.0);
}
如您所见,您可以仅使用标准C ++工具模拟该语法,而不是自定义技巧。
这是一个运行的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.