我有一些應該填充值的類,但我不知道值的型別。
澄清一下,類實體中的每個向量都填充了相同的值型別,但是 SomeClass 的一個實體可以有vector<int>另一個實體,vector<string>依此類推。
如何將向量宣告為模板,而不是模板類本身?
template<typename T>
struct tvector {
typedef std::vector< std::vector<T> > type;
};
class SomeClass {
public:
int _someField;
tvector<T> _fieldValues; // this line fails to compile
};
提前致謝
uj5u.com熱心網友回復:
有幾種不同的方法可以剪掉這頭野獸。這主要取決于您希望如何訪問此向量以及如何在運行時確定其確切型別。
標準::變體
變體可以存盤一組預定型別。如果您有許多不同的型別,這很有效但也很麻煩,因為您必須通過一些型別檢查來匯集每次訪問。
class SomeClass {
public:
using variant_type = std::variant<
std::vector<int>, std::vector<double> >;
int _someField;
variant_type _fieldValues;
void print(std::ostream& stream) const
{
switch(_fieldValues.index()) {
case 0:
for(int i: std::get<0>(_fieldValues))
stream << i << ' ';
break;
case 1:
for(double i: std::get<1>(_fieldValues))
stream << i << ' ';
break;
default: break;
}
}
};
標準::任何
Any 可以容納任何型別。提高了可擴展性,但使使用這些值變得困難。
class SomeClass {
public:
int _someField;
std::any _fieldValues;
void print(std::ostream& stream) const
{
if(_fieldValues.type() == typeid(std::vector<int>))
for(int i: std::any_cast<std::vector<int>>(_fieldValues))
stream << i << ' ';
else if(_fieldValues.type() == typeid(std::vector<double>))
for(double i: std::get<1>(_fieldValues))
stream << i << ' ';
else
throw std::runtime_error("Not implemented");
}
};
子類化
最優雅的方式(恕我直言)是使用模板子類。像這樣的東西:
class SomeClass {
public:
int _someField;
virtual ~SomeClass() = default;
virtual void print(std::ostream& stream) const = 0;
};
template<class T>
SomeClassT: public SomeClass
{
std::vector<T> _fieldValues;
public:
virtual void print(std::ostream& stream) const
{
for(const T& i: _fieldValues)
stream << i << ' ';
}
};
或者,如果您不想公開該部分,請將其設為私有成員。
class SomeClassHelper {
public:
virtual ~SomeClassHelper() = default;
virtual void print(std::ostream& stream) const = 0;
};
template<class T>
SomeClassHelperT: public SomeClassHelper
{
std::vector<T> _fieldValues;
public:
virtual void print(std::ostream& stream) const
{
for(const T& i: _fieldValues)
stream << i << ' ';
}
};
class SomeClass {
public:
int _someField;
private:
std::unique_ptr<SomeClassHelper> helper;
public:
void print(std::ostream& stream) const
{ return helper->print(stream); }
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472572.html
下一篇:包含頭檔案時遇到問題
