对任意值类型的操作

发布于 2024-07-07 19:52:31 字数 821 浏览 7 评论 0原文

这篇文章描述了一种在 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 制定了 实用程序库非常优雅地解决了操作员问题。

This article describes a way, in C#, to allow the addition of arbitrary value types which have a + operator defined for them. In essence it allows the following code:

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

This code does not compile as there is no guarantee that the T type has a definition for the '+' operator, but the effect is achieved with code like this:

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));
}

Follow the link to see how the Num class achieves this. Anyways, on to the question. Is there any way to achieve the same effect in C or C++? For the curious, the problem I'm trying to solve is to allow a CUDA kernel to be more flexible/general by allowing it to operate on more types.

Update: For .NET, Marc Gravell has made a utility library which solves the operator problem very elegantly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

今天小雨转甜 2024-07-14 19:52:31

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

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

即可工作,对于未定义运算符+的每种类型,您都会收到编译错误。

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

据我所知,在普通 C 中这是不可能的。

Due to the way templates are compiled in C++, simply doing:

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

will work, you'll get a compile error for every type where an operator+ is not defined.

C++ templates generate code for every type instantiation, so for every type T code will be generated that does the right thing. This way C++ doesn't need Num<> trickery.

In plain C, this is not possible as far as I know.

时光与爱终年不遇 2024-07-14 19:52:31

在 C++ 中,这根本不是问题。 如果将第一个示例中的代码字面翻译成 C++(预计到达时间:正如 Pieter 所做的那样),则可以正常工作,但我无法想到直接使用 + 的任何情况行不通的。 您正在寻找一个不存在的问题的解决方案。

In C++ this is simply not an issue. The code as in your first sample works if literally translated into C++ (ETA: as Pieter did), but I can't think of any situation where directly using + wouldn't work. You're looking for a solution to a problem that doesn't exist.

撞了怀 2024-07-14 19:52:31

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


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

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

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

This can easily be done in C++ using templates:


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

Note, however, that this must be defined in a header file, and you probably also want to pass the parameters by const reference instead of by value.

This cannot be done in plain C at all.

太傻旳人生 2024-07-14 19:52:31

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

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

It can be done in C as well, although I'm not sure it meets the problem requirements, with a Macro.

#define ADD(A,B) (A+B)
山田美奈子 2024-07-14 19:52:31

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

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

Templates in C++.
In C, not without massive hassle and overhead.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文