在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); }
有人对解决方案有所了解吗?
答案 0 :(得分:1)
从jprice's comment开始,如果您可以更改OpenCL代码的语法,可以通过在C ++代码中定义一个简单的struct
来使这两种语言都能正常工作:
struct float2 {
float x, y;
// define operators here
};
然后,而不是使用"演员风格"上面的语法,你可以这样做:
float2 f;
f.x = 1.f; f.y = 2.f;
哪个都适用。
答案 1 :(得分:0)
我不相信这是可能的。行float2 f = (float2)(1.f, 2.f);
可以用两种方式解释:
float2
是某种类型,请将结果(1.f, 2.f)
(使用comma operator的表达式,将float
返回)投射到float2
。由于没有float
到float2
的强制转换,因此失败。 float2
是函数/仿函数,请使用提供的两个参数执行func2
。使用前一种解释,我们可以尝试添加您尝试过的转换运算符,这必须是从float
到float2
的转换,因为(1.f, 2.f)
的结果是a 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 ++中使用完全相同的代码。
答案 2 :(得分:0)
标准库包含一个标题<complex>
,它定义了一个模板std::complex
,用于复杂数字的算术运算。
复数表示为浮点值对(实部和虚部),因此可用于模拟float2
类型。
如果您定义了别名float2
,则可以通过C样式转换模拟您的确切语法:
#include <complex>
typedef std::complex<float> float2;
int main()
{
float2 f = (float2)(1.0,2.0);
}
如您所见,您可以仅使用标准C ++工具模拟该语法,而不是自定义技巧。
Here是一个正在运行的例子。