【问题标题】:Operations on arbitrary value types对任意值类型的操作
【发布时间】:2010-09-18 07:52:33
【问题描述】:

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,它非常优雅地解决了操作符问题。

【问题讨论】:

    标签: c++ c cuda gpgpu value-type


    【解决方案1】:

    由于模板在 C++ 中的编译方式,只需这样做:

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

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

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

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

    【讨论】:

    • 值得注意的是,这种与 C++ 模板一起工作的方式已被命名为“duck typing”类型。基本上你会避开你真正想要的类型,而是说“它需要支持方法和操作 X、Y 等”。它也被用作 ruby​​ 中的主要类型机制。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      这根本不能用纯 C 语言完成。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 不!!!!不要那样做。在宏中,始终将参数括在括号中 #define SQUARE(A) ((A)*(A)) 与 #define SQUARE(A) (A*A) 会给您带来非常不同的结果 SQUARE(x+y)
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 2020-06-10
          • 1970-01-01
          • 2018-10-28
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多