2011-01-08 3 views
16

Есть ли что-то похожее на этот шаблон C++?C# общий с константой

template <int A> 
class B 
{ 
    int f() 
    { 
     return A; 
    } 
} 

Я хочу, чтобы каждый экземпляр B < 1>, B < 2>, и т.д. (например, кортеж) другого типа.

ответ

18

Короткий ответ нет.

Он не подходит для того, чтобы использовать C# generics, так как это связано с шаблонами C++.

. Генераторы .net не являются языковой функцией, они являются функцией времени исполнения. Среда выполнения знает, как создавать экземпляры генериков из специального общего байт-кода, который довольно ограничен по сравнению с тем, что могут описывать шаблоны C++.

Сравните это с шаблонами C++, которые в основном создают экземпляр всего AST класса с использованием замещенных типов. Было бы возможно добавить экземпляр AST для среды выполнения, но это, безусловно, будет намного сложнее, чем текущие дженерики.

Без таких функций, как массивы типа значений (которые существуют только в небезопасном коде), рекурсивный экземпляр шаблона или специализация шаблона с использованием таких параметров также не будут очень полезными.

+1

Ну, во время выполнения (JIT) .Net создает экземпляр. Мгновение - это, по существу, дублирование с изменениями. Я бы не стал противостоять AST до MSIL. Различное представление подобных понятий. –

12

C# не поддерживает нестандартные параметры, такие как C++.

C# generics намного проще и менее способны, чем шаблоны на C++. MSDN содержит краткий список Differences Between C++ Templates and C# Generics.

+1

Однако, дополнительная информация может быть ". кодируется "в типы (по определению контракта или иным образом), его просто видеть с фиксированным набором скрытых типов (например,' Vn: V, где Vn.Value = n для всех Vn'), но есть также [церковные цифры] (http://community.bartdesmet.net/blogs/bart/archive/2009/08/17/mis-using-c-4-0-dynamic-type-free-lambda-calcul us-church-numbers-and-more.aspx) - не то, что я рекомендую * либо подход * здесь :-) –

+1

Неправильный ответ, но было бы неплохо, если бы он предоставил ссылку на C# generics и/или говорил обобщенная декларация/«экземпляр» против экземпляра шаблона. –

+3

@pst: Конечно; вы можете кодировать информацию по типам. Вы также можете избежать генериков в целом и написать много неорганических классов. В любом случае; Я добавил ссылку на статью MSDN, в которой перечислены основные различия между шаблонами и дженериками. –

5

C# generics специализируются во время выполнения, тогда как шаблоны C++ обрабатываются во время компиляции, чтобы создать совершенно новый тип. Учитывая это, среда выполнения просто не имеет функций для обработки непиговых параметров (это не просто проблема с C#).

8

Обойти это ограничение является определение класса, который сам выставляет буквальное значение, которое вы заинтересованы в Например:

public interface ILiteralInteger 
{ 
    int Literal { get; } 
} 

public class LiteralInt10 : ILiteralInteger 
{ 
    public int Literal { get { return 10; } } 
} 

public class MyTemplateClass<L> where L: ILiteralInteger, new() 
{ 
    private static ILiteralInteger MaxRows = new L(); 

    public void SomeFunc() 
    { 
     // use the literal value as required 
     if(MaxRows.Literal) ... 
    } 
} 

Использование:

var myObject = new MyTemplateClass<LiteralInt10>(); 
Смежные вопросы