繁体   English   中英

在C ++中模仿OpenCL float2类型

[英]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); 可以用两种方式解释:

  1. 如果float2是一个类型,则将(1.f, 2.f)的结果(1.f, 2.f)使用逗号运算符的表达式,返回float )转换为float2 由于没有从floatfloat2 ,因此失败。
  2. 如果float2是函数/函子,则使用提供的两个参数执行func2

使用前面的解释,我们可以尝试像你尝试的那样添加转换运算符,这必须是从floatfloat2的转换,因为(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM