Порождение ref class от template
От: Spirit_1 Россия  
Дата: 09.02.11 09:01
Оценка:
Добрый день.

Такая проблема. Я хочу написать алгоритм в виде шаблона в Managed C++. В зависимости от требуемой точности вычислений от этого шаблона можно будет порождать классы, производящие вычисления с разной точностью (целочисленный, float, double). Обращаться к этим алгоритмам планируется из C#. Реализовал примерно так.

//Библиотека С++
    template<class T>

// Допустим алгоритм реализует умножение на 2 ))
    public ref class MultiplicatorTemplate
    {
    public:
        static T Mul2(T arg){return arg*2;}

    };

// Создаем класс потомок, который наследует метод Mul2 для операции над аргументом типа int
    public ref class MultiplicatorInt:public MultiplicatorTemplate<int>
    {
    };

// Создаем класс потомок, который наследует метод Mul2 для операции над аргументом типа float
    public ref class MultiplicatorFloat:public MultiplicatorTemplate<float>
    {
    };

// и т. д. при необходимости



Класс MultiplicatorInt в коде C# виден. Однако функции Mul2(int) в нем нет. Если же переписать класс таким образом

    public ref class MultiplicatorInt:public MultiplicatorTemplate<int>
    {
        static void foo(){Mul2(0);}
    };


то функция Mul2 становится доступной. Видимо компилятор в первом случае её просто выкинул, поскольку прямого обращения в коде к ней не было. Такую оптимизацию можно отключить в компиляторе или какими нибудь директивами препроцессора ? Могло бы получиться решение для довольно интересных задач.
Re: Порождение ref class от template
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 09.02.11 09:58
Оценка:
Здравствуйте, Spirit_1, Вы писали:

S_>Такая проблема. Я хочу написать алгоритм в виде шаблона в Managed C++. В зависимости от требуемой точности вычислений от этого шаблона можно будет порождать классы, производящие вычисления с разной точностью (целочисленный, float, double). Обращаться к этим алгоритмам планируется из C#. Реализовал примерно так.


S_>Класс MultiplicatorInt в коде C# виден. Однако функции Mul2(int) в нем нет. Если же переписать класс таким образом


S_>
S_>    public ref class MultiplicatorInt:public MultiplicatorTemplate<int>
S_>    {
S_>        static void foo(){Mul2(0);}
S_>    };
S_>


S_>то функция Mul2 становится доступной. Видимо компилятор в первом случае её просто выкинул, поскольку прямого обращения в коде к ней не было. Такую оптимизацию можно отключить в компиляторе или какими нибудь директивами препроцессора ? Могло бы получиться решение для довольно интересных задач.


Коротко:

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

Для метапрограммирования в managed code и рекомендую использовать Nemerle.

Для решения конкретной задача INumeric рекомендую решение на CityLizard.Policy.
getboost.codeplex.com
citylizard.codeplex.com
inumeric
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.