2011-04-18 108 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)) 
};