我有一个大工厂,我正在试图弄清楚如何让它看起来很漂亮 大约有40种可能的对象/构造函数组合:
if(algorithm == "SHA-1")
return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-224")
return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-256")
return new HashImpl<...>(algorithm, seed, size);
...
if(algorithm == "AES" || algorithm == "AES128")
return new BlockCipherImpl<...>(algorithm, seed, size);
...
if(algorithm == "HmacSHA1")
return new HmacImpl<...>(algorithm, seed, size);
...
有没有办法将它放入地图中,这样我至少可以取消顺序搜索?我在弄清楚如何使构造函数成为函子时遇到了问题。
编辑:代码可以在这里找到:
http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/src/crypto/SecureRandomImpl.cpp,从第130行开始。
答案 0 :(得分:5)
无需使用花哨的新奇地图。
template <class Impl>
BaseImplementation* makeAlgo (const std::string& algo,
const byte* seed, size_t size)
{
return new Impl(algo, seed, size);
}
typedef BaseImplementation* makeAlgo_t (const std::string& algo,
const byte* seed, size_t size);
typedef struct { std::string name; makeAlgo_t func; } NamedAlgoMaker_t;
NamedAlgoMaker_t factory[] = {
{ "SHA-1", makeAlgo< HashImpl <...> > },
...
{ "HmacSHA1", makeAlgo< HmacImpl <...> > },
...
};
如果对数组进行排序,则可以使用二进制搜索快速查找算法。
当然,如果你愿意的话,你也可以用这些东西建立一个地图(或散列/无序地图)。
答案 1 :(得分:1)
你可以使用lambda函数的地图
答案 2 :(得分:0)
所以它仍然在视觉上难看。但是你可以通过以下方式加快速度:
(编辑:感谢n.m.更直接的实施)