我有一个结构:
typedef struct
{
Qt::Key qKey;
QString strFormType;
} KeyPair;
现在,我初始化KeyPair实例,以便可以将其用于我的自动测试应用程序。
KeyPair gDial[] =
{
{ Qt::Key_1 , "MyForm" },
{ Qt::Key_1 , "SubForm" },
{ Qt::Key_Escape, "DesktopForm" }
};
KeyPair gIP[] =
{
{ Qt::Key_1 , "MyForm" },
{ Qt::Key_2 , "Dialog" },
{ Qt::Key_2 , "Dialog" },
{ Qt::Key_Escape, "DesktopForm" }
};
....
and like 100 more instantiations....
当前,我调用使用这些KeyPair的函数。
qDebug() << "Testing Test Menu";
pressKeyPairs( gDial);
qDebug() << "Testing Browse Menu";
pressKeyPairs( gIP);
....
and more calls like this for the rest...
我想将所有这些KeyPair实例都放置在MAP中,这样我就不必一百次调用pressKeyPairs()和qDebug()了……我是使用MAPS的新手……所以我尝试了:
map<string,KeyPair> mMasterList;
map<string,KeyPair>::iterator it;
mMasterList.insert( pair<string, KeyPair>("Testing Test Menu", *gDial) ); //which I know is wrong, but how?
mMasterList.insert( pair<string, KeyPair>("Testing IP Menu", *gIP) );
mMasterList.insert( pair<string, KeyPair>("IP Menu2", *gIP2) );
....
for ( it=mMasterList.begin() ; it != mMasterList.end(); it++ )
{
qDebug() << (*it).first << endl;
pressKeyPairs((*it).second);
// I don't know how to access .second ... this causes a compiler error
}
编辑:
pressKeyPairs声明为:
template <size_t nNumOfElements> void pressKeyPairs(KeyPair (&keys)[nNumOfElements]);
该代码块不起作用... :(有人可以告诉我如何将这些KeyPair正确放置在地图中吗?
最佳答案
我认为Henning的答案是正确的方法。
您代码中的*gDial
和*gIP
表示gDial[0]
和gIP[0]
。
因此,只需将KeyPair
数组的第一个元素插入mMasterList
。
您的pressKeyPairs
声明template<size_t nNumOfElements> void pressKeyPairs(KeyPair(&keys)[nNumOfElements]);
本身是正确的。它以对KeyPair
数组的引用作为参数。
但是,由于mMasterList
的second_type
是KeyPair
(不是KeyPair
数组),pressKeyPairs((*it).second)
调用类型不匹配错误。
以下想法如何?
制作KeyPairArray
类型
指向KeyPair
数组pressKeyPairs
引用了KeyPairArray
例如:
struct KeyPairArray {
size_t nNumOfElements;
KeyPair *keys;
template< size_t N >
KeyPairArray( KeyPair(&k)[ N ] ) : nNumOfElements( N ), keys( k ) {}
};
// Example
void pressKeyPairs( KeyPairArray const& keys )
{
for ( size_t i = 0; i < keys.nNumOfElements; ++ i ) {
qDebug()<< keys.keys[ i ].qKey <<','<< keys.keys[ i ].strFormType <<'\n';
}
}
int main() {
map<string,KeyPairArray> mMasterList;
map<string,KeyPairArray>::iterator it;
mMasterList.insert(
make_pair( "Testing Test Menu", KeyPairArray( gDial ) ) );
for ( it=mMasterList.begin() ; it != mMasterList.end(); it++ ) {
pressKeyPairs( it->second );
}
}
希望这可以帮助。