这个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,可以非常优雅地解决操作员问题。
答案 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;
}