2013-09-15 5 views
1

Я пытаюсь преобразовать некоторый код C# в код C++/CLI (по некоторым причинам производительности, а также избежать кучи вопросов взаимодействия), однако я ударил стену. По общему признанию, мои знания C++/CLI отсутствуют (в лучшем случае).C++/CLI Generic Static Class

Попытка конвертировать общий статический класс, который мы использовали для кеширования размера, является серьезной головной болью.

Класс C# выглядит следующим образом:

public static class SizeCache<T> 
{ 
    public static int Size = Marshal.SizeOf(typeof(T)); 
} 

И оболочка C++/CLI (насколько я понял) является следующим:

generic <typename T> 
public ref class SizeCache abstract sealed 
{ 
private: 
    static SizeCache() 
    { 
     Size = Marshal::SizeOf(T::typeid); 
    } 

public: 
    static int Size; 
}; 

Все, кажется, компилируется, однако, когда я обращаюсь к нему через;

int size = SizeCache<T>::Size; 

Я получаю ошибки компилятора.

ошибка C2039: 'Размер': не является членом '' глобального пространства имен'»

ошибка C2065: 'Размер': необъявленный идентификатор

К сожалению, я не могу видеть что я делаю неправильно в этом случае.

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

Что я здесь делаю неправильно?

+1

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

ответ

0

Обратите внимание, что хотя код написан на C++/CLI, вызов Маршал :: SizeOf по-прежнему является управляемым вызовом. Я не ожидаю улучшения производительности, даже если вы успешно скомпилируете код.

Вы пытались кэшировать результаты в хэш-таблице, которая прибегает к использованию C++/CLI?

Я просто проверял свой код и он прекрасно работает (просто скопировать/вставить код ниже):

using namespace System; 
    using namespace System::Runtime::InteropServices; 

    generic <typename T> 
public ref class SizeCache abstract sealed 
{ 
private: 
    static SizeCache() 
    { 
     Size = Marshal::SizeOf(T::typeid); 
    } 

public: 
    static int Size; 
}; 

int main(array<System::String ^> ^args) 
{ 
    double dsize = SizeCache<double>::Size; 
    int size = SizeCache<int>::Size; 
    return 0; 
} 
+0

Преобразование в C++/CLI относится не только к этому конкретному случаю. Это в основном для других, больших, частей библиотеки. Хранение его в Hashtable (или в словаре или любом другом варианте) в основном сводит на нет причину наличия класса статического общего типа. Это позволяет мне делать все мои работы отражения для определенного типа один раз и не подвергать никакому штрафу за просмотр при повторном использовании типа позже. – ApocDev