【发布时间】:2018-06-07 07:01:24
【问题描述】:
C++ 和 C# 都支持泛型。但是,我看不到任何方法可以将一个简单的 C++ 函数模板重写为一个单一的 C# 泛型方法:
C++
template<typename T>
int compare(const T & st1, const T & st2) {
if (std::less<T>() (st1, st2))
return -1;
return 1;
}
同时适用于int、std::string、std::vector等。
compare(33, 4); // 1
std::vector<int> v1{ 1,0 }, v2{ 1,0,0 };
compare(v1, v2); // -1
std::vector<std::string> vs1{ "hi", "bob" }, vs2{ "hi", "ben" };
compare(vs1, vs2); // 1
C#
class Demo
{
public static int Compare<T>(T v1, T v2) where T : IComparable<T>
{
if (v1.CompareTo(v2) < 0)
return -1;
return 1;
}
}
不适用于 C# Lists<>:
List<int> v1 = new List<int> { 1, 2 };
List<int> v2 = new List<int> { 3, 4 };
Console.WriteLine($"Compare(v1, v2): {Compare(v1, v2)}");
错误:没有从“System.Collections.Generic.List”到“System.IComparable>”的隐式引用转换
是让它在 C# 中同时与整数类型和集合一起工作的唯一方法是每次都重载吗?
public static int Compare<T>(List<T> v1, List<T> v2) where T : IComparable<T>
{
for (int i = 0; i < v1.Count; i++)
{
if (v1[i].CompareTo(v2[i]) < 0)
return -1;
}
return 1;
}
【问题讨论】:
-
List<int>不实现IComparable<List<int>>:您可以比较项目(int)但不能比较集合 - 默认情况下是List<int> -
要比较参考吗?还是物品?
-
我不会任何 C++,但你能解释一下 C++ 中的向量是如何知道它们是如何比较的吗?或者
less函数如何知道如何比较事物? -
“C++ 和 C# 都支持泛型。” - 嗯,C++ 支持模板,C# 支持泛型。它们是实现许多相同目标的不同方式,但它们并不相同。 (C++/CLI 可能也支持泛型,标准 C++ 现在可能也支持,但在这里您似乎只使用 C++ 模板。)This MSDN document 可能对您有用。
-
@Sweeper in C++
std::less通常使用operator <,并且此运算符按字典顺序比较std::vectors。为大多数标准容器明确定义了比较运算符。
标签: c# c++ icomparable generic-method