Инициализация статического std::map‹int, STRUCTURE› в C++

Этот сообщение научил меня инициализировать статический std::map.

Я мог бы использовать этот метод для инициализации статической карты из int в СТРУКТУРУ.

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

#include <string>
#include <map>
#include <iostream>

typedef unsigned long GUID;

enum Function {
  ADDER = 1,
  SUBTRACTOR = 2,
  MULTIPLIER = 3,
  SQUAREROOT = 4
};

struct PluginInfo
{
    GUID guid;
    std::string name;
    Function function;

    PluginInfo(GUID guid, std::string name, Function function) : guid(guid), name(name), function(function) {}
    PluginInfo() {}
};

typedef std::map<GUID, PluginInfo> PluginDB;

PluginInfo temp1(1, "Adder", ADDER);
PluginInfo temp2(2, "Multiplier", MULTIPLIER);

PluginDB::value_type pluginDbArray[] = {
    PluginDB::value_type(1, temp1),
    PluginDB::value_type(2, temp2)
};

const int numElems = sizeof pluginDbArray / sizeof pluginDbArray[0];
PluginDB pluginDB(pluginDbArray, pluginDbArray + numElems);

int main()
{
    std::cout << pluginDB[1].name << std::endl;
}

Можно ли упростить код инициализации?

PluginDB::value_type pluginDbArray[] = {
    PluginDB::value_type(1, temp1),
    PluginDB::value_type(2, temp2)
};

Я пытался

PluginDB::value_type pluginDbArray[] = {
    PluginDB::value_type(1, {1, "Adder", ADDER}),
    PluginDB::value_type(2, {2, "Multiplier", MULIPILER})
};

Однако я получил сообщения об ошибках

mockup_api.cpp:24: error: expected primary-expression before ‘(’ token
mockup_api.cpp:24: error: expected primary-expression before ‘{’ token

Думаю, я могу сделать структуру, содержащую только данные, если это возможно.

struct PluginInfo
{
    GUID guid;
    std::string name;
    Function function;
}

person prosseek    schedule 18.04.2011    source источник


Ответы (2)


Я бы использовал Boost.Assignment:

#include <boost/assign/list_of.hpp>
...
/* no more temp1, temp2, or PluginDbArray */
...
PluginDB pluginDB = boost::assign::map_list_of
    (1, PluginInfo(1, "Adder", ADDER))
    (2, PluginInfo(2, "Multiplier", MULTIPLIER));
person Robᵩ    schedule 18.04.2011

Вы не можете сделать это в С++ 98/03. Возможно, вы сможете сделать это с помощью составных инициализаторов в C++0x.

Я думаю, вы можете сделать это, что может быть достаточно хорошо на С++ 98:

PluginDB::value_type pluginDbArray[] = {
    PluginDB::value_type(1, PluginInfo(1, "Adder", ADDER)),
    PluginDB::value_type(2, PluginInfo(2, "Multiplier", MULTIPLIER))
};
person Mark B    schedule 18.04.2011