对任意值类型的操作

时间:2008-10-21 13:50:07

标签: c++ c cuda gpgpu value-type

这个article描述了一种在C#中允许添加为其定义了+运算符的任意值类型的方法。实质上它允许以下代码:

public T Add(T val1, T val2)
{
   return val1 + val2;
}

此代码无法编译,因为无法保证T类型具有“+”运算符的定义,但效果可通过以下代码实现:

public T Add(T val1, T val2)
{
   //Num<T> defines a '+' operation which returns a value of type T
   return (new Num<T>(val1) + new Num<T>(val2));
}

点击链接查看Num课程如何实现这一目标。无论如何,关于这个问题。有没有办法在C或C ++中实现相同的效果?对于好奇,我试图解决的问题是允许CUDA内核更灵活/更通用,允许它在更多类型上运行。

更新:对于.NET,Marc Gravell制作了一个utility library,可以非常优雅地解决操作员问题。

5 个答案:

答案 0 :(得分:13)

由于模板在C ++中的编译方式,只需执行以下操作:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

将起作用,对于未定义operator +的每种类型,都会出现编译错误。

C ++模板为每个类型实例化生成代码,因此对于每种类型,将生成正确的T代码。这样C ++就不需要Num&lt;&gt;欺骗。

在简单的C中,据我所知,这是不可能的。

答案 1 :(得分:4)

在C ++中,这根本不是问题。第一个示例中的代码如果直译为C ++(ETA:正如Pieter所做的那样),但我无法想到任何情况直接使用+将无法正常工作。您正在寻找一个不存在的问题的解决方案。

答案 2 :(得分:1)

这可以使用模板在C ++中轻松完成:


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

但请注意,必须在头文件中定义,您可能还希望通过const引用而不是值传递参数。

根本无法在普通C中完成。

答案 3 :(得分:1)

它也可以在C中完成,虽然我不确定它是否满足问题要求,使用宏。

#define ADD(A,B) (A+B)

答案 4 :(得分:0)

C ++中的模板。 在C中,并非没有大规模的麻烦和开销。

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}