根據這些定義,並沿着這些線路一些代碼,用於說明目的:如何在不知道底層類型的情況下從模板父類中獲取值?
class Child
{
private:
std::string name;
public:
Child(const std::string & name) name(name)
{ }
}
template<typename T>
class Parent : public Child
{
private:
T data;
public Parent(const std::string & name, const T & data) : Child(name), data(data)
{ }
inline GetData() const
{
return this->data;
}
}
std::vector<std::unique_ptr<Child>> values;
values.emplace_back(std::make_unique<Parent<int>>("value a", 4));
values.emplace_back(std::make_unique<Parent<std::string>>("value b", "test"));
for (const auto & v : values)
{
// I want to access the int and string here!
}
如何將決定從這裏基類的父類中使用的類型?
我一起工作的具體情況其實是,我有一堆包含有關存儲過程的SQL參數,是應該被包含在std::vector<std::unique_ptr<SqlParameterBase>>
並傳遞到代表一個類SqlParameter<T>
模板信息SqlParameterBase
類一個存儲過程配置,以便它可以被調用。
但是這裏的根本問題是我需要訪問底層數據,我想避免在基類中定義一個包含指向數據的指針的void *
。我更喜歡它是儘可能安全的。
我願意接受其他設計或方法來解決這個問題,所以如果你覺得它更好,請隨時提出一些完全不同的建議。
您需要'dynamic_cast',但是您真正想要的是變體類型。 – juanchopanza
是的,我知道我需要做一個動態轉換爲父類型。問題是,如果不以硬編碼的方式測試每種類型,我無法確定要投射到哪種類型。最後,我基本上需要能夠確定數據的大小,比如向量中元素的數量或字符串的長度;這些成員函數根據類型進行更改。我想過一個模板,只是假設T :: size存在,但如果函數的行爲在類型之間有不同的定義,則可能會有風險。 –
如果您需要確定數據的「大小」,如何將'virtual std :: size_t size()const = 0;'添加到'Child'? – aschepler