如果我有一个类DataManager
:
class DataManager
{
public:
int getRecordInt( size_t i ) const;
std::string getRecordString( size_t i ) const;
private:
std::vector<int> _vInt;
std::vector<std::string> _vString;
}
我可以使用例如访问记录
DataManager DM;
// .. populate object ...
int iValue = DM.getRecordInt(3);
在我的实际应用程序中,我将有超过一百种数据类型(除了 int 和 std::string),所以我想避免为每种类型编写单独的 getter。
现在,如果 C++ 支持模板化变量名(它不支持),我可以将类实现为:
class DataManager
{
public:
template<typename T>
T getRecord( size_t i ) const
{
return _v<T>[i];
}
private:
std::vector<int> _v<int>;
std::vector<std::string> _v<std::string>;
}
有什么方法可以在 C++ 中达到目的吗?
(请注意,虽然我已将示例简化到最低限度,但我的实际问题要复杂得多,需要存在这样的 DataManager
类。)
最佳答案
C++14 解决方案:
您可以做的一件事是将所有不同的 vector 放入 std::tuple
中.然后你可以使用 std::get
指定从元组中获取哪个 vector ,然后访问该 vector 。看起来像
class DataManager
{
public:
template<typename T>
T getRecord( size_t i ) const
{
return std::get<std::vector<T>>(_v)[i];
}
private:
std::tuple<std::vector<int>, std::vector<std::string>> _v{{1,2,3},{"a","b","c"}};
};
int main()
{
DataManager d;
std::cout << d.getRecord<std::string>(2);
}
哪些输出
c
关于C++ 替代模板化数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45327660/