Inicialice el diccionario estático mientras crea en C ++ / CLI

Hoy vi código C # que crea un diccionario estático y lo inicializa:

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

pero cuando decidí escribir el mismo código para C ++ / CLI, ocurrió un error. Aquí está mi intento:

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"},
    };

¿Puedo hacer esto y, de ser así, cómo?

preguntado el 16 de mayo de 11 a las 18:05

4 Respuestas

C # 3.0 y posteriores permiten a los usuarios definir un "inicializador"; para las colecciones, se trata de una serie de elementos, que para los diccionarios se simplifica a claves y valores. C ++. NET que yo sepa no tiene esta característica de lenguaje. Vea esta pregunta: es muy similar: Inicialización de matriz en C ++ administrado. Los inicializadores de matriz son el ÚNICO inicializador de este tipo en C ++; otras colecciones no las ofrecen en C ++.

Básicamente, su opción principal es declarar un constructor estático e inicializar su diccionario allí.

contestado el 23 de mayo de 17 a las 15:05

Este tipo de Dictionary<T> La inicialización es una característica no de la clase en sí, sino del compilador de C #. Lo traduce en declaraciones separadas para la creación del Dictionary<T> objeto, y la creación y adición de cada par clave / valor. No creo que el compilador de C ++ ofrezca las mismas capacidades.

contestado el 16 de mayo de 11 a las 22:05

¿Significa que no puedo inicializarlo como lo hago en C #? - Viktor Apoyan

Básicamente sí. Es una característica del lenguaje de C # que no está disponible en C ++ administrado. - KeithS

"Bien, tendría que hacerse de manera diferente" pero ¿hay alguna manera? - Viktor Apoyan

Consulte la respuesta de Keith para obtener un enlace a algo similar para las matrices. Para los diccionarios, creo que tendrías que hacer la creación y la adición línea por línea. - dlev

¡Es posible! :-)
No es sencillo, pero con una pequeña función auxiliar puede crear e iniciar un diccionario en una línea de código:

// 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);
}

Probado, funcionando.

Respondido 28 Feb 17, 11:02

Mi enfoque es (.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;
}

Respondido 23 Oct 15, 10:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.