Можно ли создать статический словарь в среде C ++ / CLI? - PullRequest
3 голосов
/ 02 марта 2010

Я использовал в своем проекте C ++ / CLI статический массив, например:

static array < array< String^>^>^ myarray=
{
  {"StringA"},
  {"StringB"}
};

Можно ли создать словарь таким же образом? Я не смог создать и инициализировать один.

static Dictionary< String^, String^>^ myDic=
{
  {"StringA", "1"},
  {"StringB", "2"}
};

Ответы [ 6 ]

2 голосов
/ 02 марта 2010

Ваш словарь и другие примеры называются Collection Initializer в C #.

Вы не можете сделать это в C ++ / CLI.

// C# 3.0
class Program
{
    static Dictionary<int, string> dict = new Dictionary<int, string>
    {
        {1, "hello"},
        {2, "goodbye"}
    };

    static void Main(string[] args)
    {
    }
}
1 голос
/ 02 марта 2010

Вы не можете сделать это непосредственно в объявлении, но вы можете использовать статический конструктор для однократной инициализации, если ваш статический конструктор вызывает метод Add().

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

Также см. это сообщение Stackoverflow . В C ++ / CLI невозможно использовать функциональность компилятора, как в C #, как написали другие.
Поэтому я создал небольшую вспомогательную функцию (см. Связанный пост), похожую на подход @MrHIDEn, но в своем решении он, похоже, использует фиксированные значения.

0 голосов
/ 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;
}
0 голосов
/ 02 марта 2010

Хотя в C ++ вы не можете создать std::map и инициализировать его как массив, вы можете загрузить карту при построении с помощью этого конструктора:

template <class InputIterator>
  map ( InputIterator first, InputIterator last,
        const Compare& comp = Compare(), const Allocator& = Allocator() );

Одной из альтернатив является использование массива и метода поиска, например binary_search. Это может быть полезно, если данные не меняются.

0 голосов
/ 02 марта 2010

Я не знаю о CLI, но разве двумерный массив не должен быть достаточно близок к тому, что вы хотите?

#include <iostream>

int main() {
  static int a[][3] = { {1, 2, 3}, {4, 5, 6}};
  std::cout << a[0][0] << " " << a[1][0];
  //..

}
...