为静态强制转换的索引数组生成数组

Making an array for a static casted indexed array

本文关键字:数组 索引 转换 静态      更新时间:2023-10-16

我不知道我的标题是否正确,但我正在努力消除重复,所以我认为我应该把这些定义放在一个数组中。有人能建议我如何将pButtons放入数组中吗?我在想一些类似pButton[EButtonHost]、pButton[EButton Username]等的东西。

#define pButtonHost static_cast<XQtMultipleStringInputButton*>(m_pButtonList[EButtonHost])
#define pButtonUsername static_cast<XQtMultipleStringInputButton*>(m_pButtonList[EButtonUsername])
#define pButtonPassword static_cast<XQtMultipleStringInputButton*>(m_pButtonList[EButtonPassword])

我下面有一个这样的方法。

XIniFile readIniFile;
readIniFile.open(k_systemIniFile, EIniReadOnly);
string data;
readIniFile.readString("Server", "host", data);
pButtonHost->setString(data);
m_host = pButtonHost->getString();
readIniFile.readString("Server", "username", data);
pButtonUsername->setString(data);
m_username = pButtonUsername->getString();
readIniFile.readString("Server", "password", data);
pButtonPassword->setString(data);
m_password = pButtonPassword->getString();

它们看起来像重复的,所以我正在尝试优化它。谢谢!

更新:我现在有这样的东西。这样对吗?或者你有什么更好的建议吗?

for (int i = 0; i < 3; ++i) {
    readIniFile.readString("Server", k_dataList[i], data);
    static_cast<XQtMultipleStringInputButton*>(m_pButtonList[i])->setString(data);
    m_pData[i] = static_cast<XQtMultipleStringInputButton*>(m_pButtonList[i])->getString();
}

下面的代码通过使用auto和`lambda',看起来很清楚

auto GetConfigInfo = [&](string section_name, ButtonType btn_type)-> string
{
    readIniFile.readString("Server", section_name, data);
    m_pButtonList[btn_type_]->setString(data);
    return m_pButtonList->getString();
};
m_host      = GetConfigInfo("host",     EButtonHost);
m_username  = GetConfigInfo("username", EButtonUserName);
m_password  = GetConfigInfo("password", EButtonPassword);

使用struct定义数据类型可以是其他方法。

struct ConfigDefine
{
    string  section_;
    ButtonType btn_type_; //your enum button type, such as EButtonHost, EButtonUserName
    string& result_;
}configs[]  = 
{
    {"host",     EButtonHost,     m_host},
    {"username", EButtonUserName, m_username},
    {"password", EButtonPassword, m_password}
};
for_each(std::begin(configs), std::end(configs), [&](ConfigDefine& config)
{
    readIniFile.readString("Server", config.section_, data);
    m_pButtonList[config.btn_type_]->setString(data);
    config.result_ = pButtonHost->getString();
});

你打算有这样的东西吗?

#define ASIZE 3
int indx[ASIZE] = {EButtonHost, EButtonUsername, EButtonPassword};
string s[ASIZE] = {"host", "username", "password"};
string *m[ASIZE] = {&m_host, &m_username, &m_password};
for (int i = 0; i < ASIZE; i++) {
  readIniFile.readString("Server", s[i].c_str(), data);
  pButtonHost->setString(data);
  *m[i] = pButtonHost->getString();
}