Как написать шаблон или общий тип для аналогичных типов данных с различным размером типа?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как написать шаблон или общий тип для аналогичных типов данных с различным размером типа?

Сообщение Anonymous »

Я написал пару типов данных (

Код: Выделить всё

struct< /code>) хранить небольшие массивы и копировать их значениями: < /p>
[list]
[*]Array4 { base: int16|short, purpose: to store up to 4 values }
[*]

Код: Выделить всё

Array8 { base: int32|int, purpose: to store up to 8 values }
[*]

Код: Выделить всё

Array16 { base: int64|long, purpose: to store up to 16 values }
[/list]
4 бита на каждый элемент в этих массивах.
ниже приведен код.
Общая часть:
using System;
using System.Collections;
using System.Collections.Generic;
< /code>
Объявление типов (3): < /p>
namespace MyProject {
using T = Array4;

public struct Array4 : IEquatable, IComparable, IEnumerable
{
private short v;
public Array4(int v) => this.v = (short)v;
public Array4(params int[] a) {
int v = 0;
foreach(int i in a)
v = (v (v >> (i v ^= (short)((value & 0x0F ^ this) GetEnumerator();
public override int GetHashCode() => v.GetHashCode();
public override bool Equals(object o) => o is T && Equals((T)o);
public bool Equals(T o) => v.Equals(o.v);
public int CompareTo(T o) => v.CompareTo(o.v);

public static bool operator ==(T l, T r) => l.v == r.v;
public static bool operator !=(T l, T r) => l.v != r.v;
public static bool operator < (T l, T r) => l.v < r.v;
public static bool operator > (T l, T r) => l.v > r.v;
public static bool operator l.v =(T l, T r) => l.v >= r.v;

public static implicit operator T(short v) => new T(v);
public static explicit operator short(T o) => o.v;
}
}
< /code>
namespace MyProject {
using T = Array8;

public struct Array8 : IEquatable, IComparable, IEnumerable
{
private int v;
public Array8(int v) => this.v = v;
public Array8(params int[] a) {
int v = 0;
foreach(int i in a)
v = (v (v >> (i v ^= (value & 0x0F ^ this) GetEnumerator();
public override int GetHashCode() => v.GetHashCode();
public override bool Equals(object o) => o is T && Equals((T)o);
public bool Equals(T o) => v.Equals(o.v);
public int CompareTo(T o) => v.CompareTo(o.v);

public static bool operator ==(T l, T r) => l.v == r.v;
public static bool operator !=(T l, T r) => l.v != r.v;
public static bool operator < (T l, T r) => l.v < r.v;
public static bool operator > (T l, T r) => l.v > r.v;
public static bool operator l.v =(T l, T r) => l.v >= r.v;

public static implicit operator T(int v) => new T(v);
public static explicit operator int(T o) => o.v;
}
}
< /code>
namespace MyProject {
using T = Array16;

public struct Array16 : IEquatable, IComparable, IEnumerable
{
private long v;
public Array16(long v) => this.v = v;
public Array16(params int[] a) {
long v = 0L;
foreach(int i in a)
v = (v (int)(v >> (i v ^= (value & 0x0F ^ this) GetEnumerator();
public override int GetHashCode() => v.GetHashCode();
public override bool Equals(object o) => o is T && Equals((T)o);
public bool Equals(T o) => v.Equals(o.v);
public int CompareTo(T o) => v.CompareTo(o.v);

public static bool operator ==(T l, T r) => l.v == r.v;
public static bool operator !=(T l, T r) => l.v != r.v;
public static bool operator < (T l, T r) => l.v < r.v;
public static bool operator > (T l, T r) => l.v > r.v;
public static bool operator l.v =(T l, T r) => l.v >= r.v;

public static implicit operator T(long v) => new T(v);
public static explicit operator long(T o) => o.v;
}
}
< /code>
They are very similar.
I want to unite those data structures into 1 declaration. Is it possible ?
It would be great to have ability to use a macros or code generator or some generic type.
I already know there is no macros in C# and I know about code generation and T4 text templates but it looks not applicable to my code.
It seems that generic type is the only option here, but I failed when I tried to use it.
Here is my try with comments about occurred errors:
namespace MyProject {
using T = Array; // error: type T could not be found
using T = Array; // error: type N could not be found

public struct Array : IEquatable, IComparable, IEnumerable
// where N : int // int is not valid constraint
where N : struct, IEquatable, IComparable // or something
{
private N v;
public Array(N v) => this.v = v;
public Array(params int[] a) {
N v = 0; // error: cannot convert int to N
foreach(int i in a)
v = (v > (i v ^= (value & 0x0F ^ this) GetEnumerator();
public override int GetHashCode() => v.GetHashCode();
public override bool Equals(object o) => o is T && Equals((T)o);
public bool Equals(T o) => v.Equals(o.v);
public int CompareTo(T o) => v.CompareTo(o.v);

public static bool operator ==(T l, T r) => l.CompareTo(r) == 0;
public static bool operator !=(T l, T r) => l.CompareTo(r) != 0;
public static bool operator < (T l, T r) => l.CompareTo(r) < 0;
public static bool operator > (T l, T r) => l.CompareTo(r) > 0;
public static bool operator l.CompareTo(r) =(T l, T r) => l.CompareTo(r) >= 0;

public static implicit operator T(N v) => new T(v);
public static explicit operator N(T o) => o.v;
}
}
< /code>
Somebody please let me know how to write similar template/generic properly.

Подробнее здесь: https://stackoverflow.com/questions/796 ... fferent-si
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»