2016-01-13 3 views
-3

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

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

Есть ли синтаксис в наборе инструментов преобразования шаблонов текста, который фактически будет работать так, как делают шаблоны на C++?

Edit:

Допустим, у меня есть этот файл Tt:

<# string[] typeNameStrings = new string[2] {"Vector2d", "Vector3d"}; 
     foreach (string s in substitutions) 
     { #> 
      public class SumCalculator<#= s #> 
      { 
       public <#= s #> sum; 
       public SumCalculator<#= s #>(<#= s #> a, <#= s #> b) 
       { 
        sum = a + b; 
       } 
      } 
    <# } #> 

Я не хочу, чтобы сохранить массив typeNameStrings, а затем использовать созданные классы SumCalculatorVector2d, SumCalculatorVector3d и т.д. Вместо этого, я хотите как можно ближе подойти к возможностям шаблонов C++ (т.е. SumCalculator<WhateverClass>). Как мне это сделать?

+1

Generics - это не шаблоны. Вы как-то наткнулись на это. Код поможет здесь. Я имею в виду, что вы пытаетесь написать C++ в C#, и, вероятно, есть несколько вариантов выбора, которые можно сделать с точки зрения того, как вы это делаете. Трудно сказать, без особых подробностей. –

+0

Спасибо за ваши предложения. Я добавил пример кода. –

+0

Вы заявили, что классы не имеют общего интерфейса, но вы предполагаете, что у них есть оператор '+'. Это звучит как общий интерфейс для меня. В C# или C++ я ожидал, что эти вещи будут храниться в контейнере и на них будет функтор, а не на тот подход, который вы указываете. Возможно, я слишком ограничен в своих методах, чтобы помочь здесь. Удачи. –

ответ

1

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

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

Тем не менее, C# имеет задание утиного времени выполнения с использованием ключевого слова dynamic. Для (малого) штрафа за производительность и (что более важно) потери проверки ошибок во время компиляции вы можете просто объявить свой объект dynamic и вызвать функции и получить доступ к ним, как если бы вы использовали шаблоны C++.