2011-04-18 107 views
0

這個post教會了我如何初始化靜態std :: map。在C++中初始化靜態std :: map <int,STRUCTURE>

我可以用這種方法初始化a static map from int to 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; 
} 

回答

1

我會使用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)); 
4

你不能在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)) 
};