声明相同类型的变量并重用它们

Declaring variables of same type and reusing them

我有以下情况,想知道是否有好的解决方案。

我正在使用 Crypto++ 并声明以下内容:

if (_HashType == SHA1)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA256)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA384)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA512)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
    pbkdf.DeriveKey(...)
}

我想做的是这样的:

PKCS5_PBKDF2_HMAC<?> pbkdf;     
if (_HashType == SHA1)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
else if (_HashType == SHA256)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
else if (_HashType == SHA384)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
else if (_HashType == SHA512)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;

pbkdf.DeriveKey(...)    

有什么建议吗?

PKCS5_PBKDF2_HMAC<> 的共同基础 class 是 PasswordBasedKeyDerivationFunction,所以您可以做的是:

PasswordBasedKeyDerivationFunction* pbkdf;     
if (_HashType == SHA1)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>();
else if (_HashType == SHA256)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>();
else if (_HashType == SHA384)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>();
else if (_HashType == SHA512)
    pbkdf = PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>();

pbkdf->DeriveKey(...)    

//...
delete pbkdf;

如果您使用的是C++11或更高版本,您可以使用智能指针而不必担心内存管理:

std::unique_ptr<PasswordBasedKeyDerivationFunction> pbkdf;     

if (_HashType == SHA1)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>());
else if (_HashType == SHA256)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>());
else if (_HashType == SHA384)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>());
else if (_HashType == SHA512)
    pbkdf.reset(PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>());

pbkdf->DeriveKey(...)