Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的模板函数-返回类型? 看起来C不支持C++类模板。比如说 template <class myType> myType GetMax (myType a, myType b) { return (a>b?a:b); }_C#_Templates_Function Templates - Fatal编程技术网

C# C中的模板函数-返回类型? 看起来C不支持C++类模板。比如说 template <class myType> myType GetMax (myType a, myType b) { return (a>b?a:b); }

C# C中的模板函数-返回类型? 看起来C不支持C++类模板。比如说 template <class myType> myType GetMax (myType a, myType b) { return (a>b?a:b); },c#,templates,function-templates,C#,Templates,Function Templates,我希望我的函数有基于其参数的返回类型,如何在c中实现这一点?如何在C中使用模板 编辑:我可以使用object和getType来达到几乎相同的目的吗?在C中使用泛型来获得类似模板的功能 仿制药 class MyClass<T> where T : IEnumerable (any parent class here!) { T myGeneric {get; set;} } 你会想看看的。语法: 希望这有帮助 问候,, 托马斯 < P> C中最接近C++模板的是泛型-但它们不是

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


编辑:我可以使用object和getType来达到几乎相同的目的吗?

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

仿制药

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}

你会想看看的。语法:

希望这有帮助

问候,,
托马斯

< P> C中最接近C++模板的是泛型-但它们不是很接近。特别是,不能在泛型类型值之间使用>之类的运算符,因为编译器不知道它们,并且不能基于运算符约束类型。另一方面,你可以写:

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

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


泛型的完整描述远远超出了堆栈溢出答案的范围;有一些信息,或者参考您最喜欢的C语言书。

您的代码将变成如下:

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

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

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

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}

你是说像这样的事

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

我正要说同样的话,但由于行“returna>b?a:b;”的缘故,它无法编译他需要一个接口约束之类的东西……你不能用这种方式比较a和b,因为编译器不知道T是什么。如果类型T不支持比较呢?我给出的函数只是一个示例,那么除了比较之外的函数呢?@LifeH2O:这取决于-它是在接口中指定的吗?如果是这样,您可以约束泛型类型来实现接口或从给定的基类派生。等等。作为C++开发人员,您可能会发现自己对C的泛型感到失望。但它们在许多场景中仍然有用,值得学习。我已经深入地听说C对泛型有一些很好的解释:我给出的函数只是一个示例,除了比较,其他函数如何?@Life2HO:那么,你想要什么函数?它是在接口中指定的实例方法吗?如果是这样的话,你就没事了。我不知道你会如何使用GetType来完成同样的事情,不。而且你也不希望API返回对象,除非你很高兴调用方必须到处转换。
public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
{
    return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
}
public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }