我正在研究一個C++項目(Embarcadero C++ Builder),其中許多類(都在同一個命名空間中)需要從顏色名稱中獲取顏色值。爲了實現這一點,我創建的函數getColorCode()由所有類所使用的,在單獨的一段代碼,Tools.cpp,如下圖所示:函數的單個實例
#include "Tools.h"
namespace mynamespace {
int getColorCode(std::string Name)
{
if (Name == "red") return(0xFF0000);
else if (Name == "green") return(0x00FF00);
else if (Name == "blue") return(0x0000FF);
// many more else ifs
else return(0x000000);
}
}
頭文件是:
#ifndef MYNAMESPACE_TOOLS_H
#define MYNAMESPACE_TOOLS_H
#include <string>
namespace mynamespace {
int getColorCode(std::string Name);
}
#endif
這作品,但我希望將所有顏色定義存儲在地圖中以避免數百個其他ifs。我的問題是,我無法在Tools.cpp的頭文件中定義類似std::map<std::string, int> ColorNames;
的東西,也沒有在定義地圖的線上獲得W8058 Cannot create pre-compiled header
。另外,我得到了幾個鏈接器警告,mynamespace :: ColorNames在每個類中定義,包括Tools.h。
我的計劃是在第一次調用getColorCode()時通過檢查map.empty()來填充地圖,並將所有的顏色名稱和代碼添加到它,如果它是空的,所以更多的調用將只搜索地圖。
另一個嘗試是爲此創建工具類並在構造函數中初始化映射。但是然後每個使用它的課程創建一個它自己的實例,我不想要。閱讀關於單身人士的討論並嘗試提出的代碼並沒有幫助。
是否有任何實際的方法來實現這個或我應該留在醜陋的(非表演)if-then-else鏈?
感謝您的任何提示,阿明
你爲什麼預設if-then-else鏈是非高性能的?你有分析過嗎?我相信你通過比較*字符串*來獲得更大的命中,那麼你會從一個if-then-else鏈中獲得。你在這裏咆哮錯誤的樹。 –
您需要一個命名空間範圍的變量,例如'std :: map ColprNames;''namespace mynamespace'內'Tools.cpp'中的某處。保留'getColorCode()'函數,但使用地圖。 –
@ n.m。 : 謝謝你的評論。我嘗試了它與下面的重新運行類似的提示,它解決了我的問題。 – Armin