C++ 替代模板化数据成员

标签 c++ templates design-patterns containers c++03

如果我有一个类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

Live Example

关于C++ 替代模板化数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45327660/

相关文章:

非具体类型的 C++ 模板特化(另一个模板类!)

entity-framework - 为什么 EntityFramework.Extended 库在更新和删除时不需要调用 SaveChanges()?

java - 使用干净的代码基于 "template" HashMap 动态创建 HashMap

javascript - 用于对象叠瓦的漂亮 JavaScript 模式(模拟多重继承)

c++ - POSIX 队列配置

c++ - 使用 Boost Graph 搜索 DAG Graph?

c++ - 有人有在 iOS 下运行的 OpenGL ES 2.0 Qt 5 示例吗?

c++ - Eigen 无法给出正确的矩阵逆 (c++)

c++ - 模板链接器错误的显式实例化

python - 找到较低级别的模板