И C ++, и C # поддерживают дженерики.Однако я не вижу способа переписать простой шаблон функции C ++, который сравнивает любые два аргумента (arg1> arg2?), В единый универсальный метод 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;
}