任意值类型的操作

jquia 发布于 2018-05-16 c 最后更新 2018-05-16 19:45 107 浏览

这个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,它非常优雅地解决了操作员问题。
已邀请:

psed

赞同来自:

由于模板以C++编译的方式,只需执行:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}
将工作,你会得到一个编译错误的每个类型的运营商+没有定义。 C++模板为每个类型实例化生成代码,因此对于每个类型,将生成正确的T代码。这样C++不需要Num诡计。 在普通的C中,据我所知,这是不可能的。

uet

赞同来自:

这可以很容易地使用模板在C++中完成:

template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}
但是请注意,这必须在头文件中定义,并且您可能还想通过const引用而不是按值传递参数。 这完全不能用纯C完成。

aeius

赞同来自:

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

aeius

赞同来自:

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

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

qquas

赞同来自:

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

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