代码之家  ›  专栏  ›  技术社区  ›  Morten Christiansen

对任意值类型的操作

  •  5
  • Morten Christiansen  · 技术社区  · 16 年前

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

    5 回复  |  直到 15 年前
        1
  •  13
  •   Pieter    16 年前

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

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

    如果有效,那么对于未定义运算符+的每种类型,都会出现编译错误。

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

    简单地说,据我所知,这是不可能的。

        2
  •  4
  •   Leon Timmermans    16 年前

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

        3
  •  1
  •   Adam Rosenfield    16 年前

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

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

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

    这在普通的C中根本做不到。

        4
  •  1
  •   lefticus    16 年前

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

    #define ADD(A,B) (A+B)
    
        5
  •  0
  •   Paul Nathan    16 年前

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

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