文章介绍了一种方法, 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制作了实用程序库非常优雅地解决了操作员问题。

有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

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


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

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

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

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

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

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

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top