我正在嘗試使用 lambdas 來找到一種方法來查找基型別別的向量中有多少特定的派生類。
std::vector<std::unique_ptr<Account>> openedAccounts;
int countCurrent = std::count_if(openedAccounts.begin(), openedAccounts.end(),
[](std::unique_ptr<Account> ptr) { return dynamic_cast<Current&>(*ptr) != nullptr; }); // I will call this for savings as well
account 是一個基礎抽象類,current 是一個派生類。
我收到錯誤no operator != matches these operands".
但是,我認為動態轉換可以回傳空 ptr。
uj5u.com熱心網友回復:
動態演員表準確地回傳您所要求的內容。
您要求Current&或提供當前參考。
你可能想問這個
return dynamic_cast<Current*>(ptr.get()) != nullptr;
uj5u.com熱心網友回復:
我認為動態轉換可以回傳空 ptr。
僅當您動態轉換為指標型別時。
參考沒有 null 的表示。當您動態轉換為參考型別時,如果指標轉換回傳 null,則會引發例外。
那有什么辦法呢?
dynamic_cast<Current*>(ptr.get())
會作業。但是,需要的設計dynamic_cast通常很糟糕。dynamic_cast存在主要是為了解決設計糟糕的 API。
我建議考慮替代設計。
uj5u.com熱心網友回復:
std::vector<std::unique_ptr<Account>> openedAccounts; int countCurrent = std::count_if(openedAccounts.begin(), openedAccounts.end(), [](std::unique_ptr<Account> ptr) { return dynamic_cast<Current&>(*ptr) != nullptr; }); // I will call this for savings as well
我在這段代碼中看到 3 個問題:
dynamic_cast<Current&> ... != nullptr-dynamic_cast為參考拋出例外并且永不回傳null_ptr。- Lambda 是不正確的,因為引數
std::unique_ptr<Account>是試圖創建一個應該是唯一的東西的副本。 - 如果您有指向某個抽象的指標的容器并且您必須這樣做,
dynamic_cast那么這清楚地表明所使用的抽象是無效的。
所以這應該看起來更像這樣:
class Account {
public:
virtual bool isCurrent() { return false; }
....
};
std::vector<std::unique_ptr<Account>> openedAccounts;
int countCurrent = std::count_if(openedAccounts.begin(), openedAccounts.end(),
[](const std::unique_ptr<Account>& ptr) { return ptr->isCurrent(); });
我不明白最后一點很難處理,所以這里是hacky修復:
int countCurrent = std::count_if(openedAccounts.begin(), openedAccounts.end(),
[](const std::unique_ptr<Account>& ptr) { return dynamic_cast<Current *>(ptr.get()) != nullptr; });
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/385073.html
