Используйте C ++ CLI шаблон класса в C # - PullRequest
8 голосов
/ 25 марта 2009

У меня есть следующий класс в C ++ / CLI и явный экземпляр шаблона для примитива int ..

template<typename T>
public ref class Number
{
    T _value;
public:
    static property T MinValue
    {
        T get()
        {
            return T::MinValue;
        }
    }

    static property T MaxValue
    {
        T get()
        {
            return T::MaxValue;
        }
    }

    property T Value
    {
        T get()
        {
            return _value;
        }

        void set(T value)
        {
            if( value<MinValue || value > MaxValue)
                throw gcnew System::ArgumentException("Value out of range");

            _value = value;
        }
    }

};

template ref class Number<int>;

При компиляции и проверке сгенерированной сборки с помощью рефлектора я могу видеть класс с именем Number<int>, но, пытаясь создать экземпляр этого же класса в C #, компилятор жалуется, что какой-то класс System::Number не принимает аргумент шаблона. Что я делаю неправильно? Можно ли вообще это сделать?

Ответы [ 3 ]

12 голосов
/ 25 марта 2009

У меня есть обходной путь, объявляю дополнительный класс, наследующий класс Number<int>. Этот класс теперь виден в C # и может быть создан.

public ref class MyInt32 : public Number<int>
{
};
10 голосов
/ 25 марта 2009

Отражатель лежит немного здесь. Название класса на самом деле не номер . Это на самом деле «Число ». Обратите внимание на одинарные кавычки. Они видны только при просмотре имени типа с помощью ildasm.

Я полагаю это сделано для того, чтобы сделать тип несвязываемым в большинстве языков, поскольку у них нет способа понять, как на самом деле работает шаблон C ++. Это делает его фактически видимым только для компилятора C ++, что подходит, поскольку это единственный MS-компилятор, который фактически поддерживает шаблоны (templates! = Generics).

1 голос
/ 25 марта 2009

Если ваша цель - создать параметризованный тип в CLI C ++, а затем использовать этот тип из C #, я думаю, что вам нужно создать общий тип, а не шаблонный тип (см. Блог Стэна Липпмана по причинам, почему существуют оба метода). См. здесь для получения информации о том, как создавать универсальные типы в C ++ CLI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...