在C ++中模仿OpenCL float2类型

时间:2014-05-28 10:40:40

标签: c++ opencl

在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); }

有人对解决方案有所了解吗?

3 个答案:

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

  1. 如果float2是某种类型,请将结果(1.f, 2.f)(使用comma operator的表达式,将float返回)投射到float2。由于没有floatfloat2的强制转换,因此失败。
  2. 如果float2是函数/仿函数,请使用提供的两个参数执行func2
  3. 使用前一种解释,我们可以尝试添加您尝试过的转换运算符,这必须是从floatfloat2的转换,因为(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是一个正在运行的例子。