5

本文描述了一种在 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 制作了一个实用程序库,可以非常优雅地解决操作员问题。

4

5 回答 5

13

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

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

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

C++ 模板为每种类型实例化生成代码,因此对于每种类型,都会生成正确的 T 代码。这样 C++ 就不需要 Num<> 诡计了。

据我所知,在纯 C 语言中,这是不可能的。

于 2008-10-21T13:54:52.847 回答
4

在 C++ 中,这根本不是问题。如果将第一个示例中的代码按字面翻译成 C++(ETA:就像 Pieter 所做的那样),那么代码就可以工作,但我想不出直接使用 + 不起作用的任何情况。您正在寻找不存在的问题的解决方案。

于 2008-10-21T13:56:42.110 回答
1

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


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

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

这根本不能在纯 C 中完成。

于 2008-10-21T13:55:05.093 回答
1

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

#define ADD(A,B) (A+B)
于 2008-10-21T14:06:25.913 回答
0

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

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
于 2008-10-21T13:56:42.127 回答