gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:49:11 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com