代码之家  ›  专栏  ›  技术社区  ›  SMUsamaShah

C-返回类型中的模板函数?

  •  17
  • SMUsamaShah  · 技术社区  · 14 年前

    C语言不支持C++类模板。例如

    template <class myType>
    myType GetMax (myType a, myType b) {
     return (a>b?a:b);
    }
    

    我希望我的函数具有基于其参数的返回类型,如何在C中实现这一点?如何在C中使用模板#

    编辑: 我可以将object和gettype用于几乎相同的目的吗?

    7 回复  |  直到 7 年前
        1
  •  33
  •   Jon Skeet    14 年前

    C中最接近C++模板的是泛型-但它们不是 非常 关闭。尤其是,不能使用像 > 在泛型类型值之间,因为编译器不知道它们(并且不能基于运算符约束类型)。另一方面,你可以写:

    public T GetMax<T>(T lhs, T rhs)
    {
        return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
    }
    

    public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
    {
        return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
    }
    

    注意,第一个是空安全的,第二个不是。

    对泛型的完整描述远远超出了堆栈溢出答案的范围; MSDN 有一些信息,或者查阅你最喜欢的C书。

        2
  •  6
  •   Matt Greer    14 年前

    C语言中的泛型不如C++中的模板强大。你想做的事情不适用于C。

    针对您的情况的黑客/解决方案是

    public T GetMax<T>(T a, T b) where T: IComparable {
        if(a.CompareTo(b) > 0) {
            return a;
        }
        return b;
    }
    
        3
  •  2
  •   Brad Cunningham    14 年前

    使用C中的泛型获得类似模板的功能。

    http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

    public class MyType<T>
    {
    }
    
        4
  •  2
  •   Lee    14 年前

    您的代码将变成这样:

    public T GetMax<T>(T a, T b) where T : IComparable<T>
    {
        return a.CompareTo(b) > 0 ? a : b;
    }
    
        5
  •  2
  •   thmshd    14 年前

    你想看看 generics . Syntax:

    public T GetMax<T>(T a, T b) {
        return (a>b?a:b);
    }
    

    更新 因为一些评论…我只是想提供一个 非常快 概述。是的,我想它不能正确地编译或执行。但这是关于这看起来如何的基本概念。同时,你会发现更多关于这个主题的完整回复。

    执行语法:

    int a = 5;
    int b = 10;
    int result = GetMax(a, b);
    

    希望这有帮助,

    当做, 托马斯

        6
  •  0
  •   Jake Kalstad    14 年前

    仿制药!

    class MyClass<T> where T : IEnumerable (any parent class here!)
    {
       T myGeneric {get; set;}
    }
    
        7
  •  0
  •   Siddarth Kanted    7 年前

    你是说这样的事

       public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
       {
           if (source == null) return null;
           return source.Select(selector);
       }