Инициализация статического std :: map <int, STRUCTURE> в C ++ - PullRequest
0 голосов
/ 19 апреля 2011

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

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

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

#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;
}

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

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

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

PluginDB::value_type pluginDbArray[] = {
    PluginDB::value_type(1, PluginInfo(1, "Adder", ADDER)),
    PluginDB::value_type(2, PluginInfo(2, "Multiplier", MULTIPLIER))
};
1 голос
/ 19 апреля 2011

Я бы использовал Повышение. Назначение :

#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));
...