Инициализировать статический словарь при создании в C ++ / CLI - PullRequest
9 голосов
/ 16 мая 2011

Сегодня я увидел код C #, который создает статический словарь и инициализирует его:

public static readonly Dictionary<string, string> dict = new Dictionary<string, string>()
        {
            {"br","value1"},
            {"cn","value2"},
            {"de","value3"},
        };

, но когда я решил написать тот же код для C ++ / CLI, произошла ошибка.Вот моя попытка:

static System::Collections::Generic::Dictionary<System::String^, System::String^>^ dict = gcnew System::Collections::Generic::Dictionary<System::String^, System::String^>( )
    {
        {"br","value1"},
        {"cn","value2"},
        {"de","value3"},
    };

Могу ли я это сделать, и если да, то как?

Ответы [ 4 ]

8 голосов
/ 16 мая 2011

C # 3.0 и выше позволяет пользователям определять «инициализатор»; для коллекций это ряд элементов, которые для словарей упорядочены по ключам и значениям. C ++. NET, насколько мне известно, не имеет этой языковой функции. Смотрите этот вопрос: это очень похоже: Инициализация массива в Managed C ++ . Инициализаторы массива являются ЕДИНСТВЕННЫМ таким инициализатором в C ++; другие коллекции не предлагают их в C ++.

По сути, ваш основной вариант - объявить статический конструктор и инициализировать ваш словарь.

4 голосов
/ 16 мая 2011

Этот тип инициализации Dictionary<T> является функцией не самого класса, а компилятора C #. Он переводит его в отдельные операторы для создания объекта Dictionary<T>, а также для создания и добавления каждой пары ключ / значение. Я не верю, что компилятор C ++ предлагает те же возможности.

1 голос
/ 28 февраля 2017

Это возможно!: -)
Не просто, но с помощью крошечной вспомогательной функции вы можете создать и запустить словарь в одной строке кода:

// helper class
generic <class TKey, class TValue>
ref class CDict
{
public:
  static Dictionary<TKey, TValue>^ CreateDictionary (...array<KeyValuePair<TKey, TValue>>^ i_aValues)
  {
    Dictionary<TKey, TValue>^ dict = gcnew Dictionary<TKey, TValue>;
    for (int ixCnt = 0; ixCnt < (i_aValues ? i_aValues->Length : 0); ixCnt++)
      dict->Add (i_aValues[ixCnt].Key, i_aValues[ixCnt].Value);
    return dict;
  }
};

// Test
ref class CTest
{
public:
  static Dictionary<int, String^>^ ms_dict = CDict<int, String^>::CreateDictionary (gcnew array<KeyValuePair<int, String^>>
  {
    KeyValuePair<int, String^>(1, "A"),
    KeyValuePair<int, String^>(2, "B")
  });
};

int main()
{
  for each (KeyValuePair<int, String^> kvp in CTest::ms_dict)
    Console::WriteLine (kvp.Key.ToString() + " " + kvp.Value);
}

Проверено, работает.

1 голос
/ 23 октября 2015

Мой подход (.NET 4.5):

// file.h
using namespace System;
using namespace System::Collections::Generic;
// SomeClass
public://or private:
    static Dictionary<String^, String^>^ dict = dictInitializer();
private:
    static Dictionary<String^, String^>^ dictInitializer();

// file.cpp
#include "file.h"
Dictionary<String^, String^>^ SomeClass::dictInitializer(){
    Dictionary<String^, String^>^ dict = gcnew Dictionary<String^, String^>;
    dict->Add("br","value1");
    dict->Add("cn","value2");
    dict->Add("de","value3");
    return dict;
}
...