是否可以在C ++ / CLI环境中创建静态字典?

时间:2010-03-02 16:41:22

标签: .net dictionary static c++-cli

我在我的C ++ / CLI项目静态数组中使用过:

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

是否可以以相同的方式创建字典? 我无法创建和初始化一个。

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

7 个答案:

答案 0 :(得分:2)

您的词典示例和其他词组在C#中称为Collection Initializer

您无法在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 :(得分:1)

您无法直接在声明中执行此操作,但您可以使用静态构造函数通过让静态构造函数调用Add()方法来执行一次初始化。

答案 2 :(得分:0)

我不知道CLI,但二维数组不应该与你想要的非常接近吗?

#include <iostream>

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

}

答案 3 :(得分:0)

虽然在C ++中你无法创建std::map并像数组一样初始化它,但你可以在构造时使用这个构造函数加载地图:

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

另一种方法是使用数组和搜索方法,例如binary_search。如果数据没有改变,这可能很有用。

答案 4 :(得分:0)

我的方法是(.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;
}

答案 5 :(得分:0)

另见this Stackoverflow post。在C ++ / CLI中,不可能像其他人一样使用C#中的编译器功能 因此我创建了一个小辅助函数(参见链接的帖子),类似于@MrHIDEn的方法,但在他的解决方案中,他似乎使用了固定值。

答案 6 :(得分:0)

在C ++中:

#include <map>

std::map< int, std::string > status_to_str {
  {0, "failure"},
  {1, "none"},
  {2, "success"},
};

void print_status(int status) {
  std::cout<< status_to_str[status] << std::endl;
}