c++ - 模板化多栈实现 - 如何?
问题描述
我需要一个“MultiStack”来获取不同类型的对象,将每种类型放在一个单独的堆栈中。
到目前为止,这就是它的样子。开放的问题是:如何处理多个不同 T 的容器
class MultiStack
{
public:
template<typename T>
const T& Get()
{
return Container<T>.back();
}
template<typename T>
void Push( const T& t )
{
Container<T>.push_back( t );
}
template<typename T>
void Pop( const T& /*t*/ )
{
Container<T>.pop_back();
}
private:
// this does not make sense, we obv. need one stack for each T
// template<typename T>
// std::vector<T> Container;
};
现在,我可以使用旧技巧,将 Container 放入成员函数中,例如
template<typename T>
auto GetContainer()
{
static std::vector<T> C;
return C;
}
但是在多线程时代我不再喜欢这样了。这很“危险”,对吧!?
有没有更好、更优雅的方式?可以想象我事先知道允许的类型,如果这有助于实现它。
解决方案
但是在多线程时代我不再喜欢这样了。这很“危险”,对吧!?
问题不是多线程。初始化就好了。不过,您仍然必须像常规的多线程代码一样保护/同步访问。
问题是容器不是每个实例MultiTask
,因为它是静态的。它几乎就像MultiTask
一个单身人士。
可以想象我事先知道允许的类型,如果这有助于实现它。
这会有所帮助,然后您可以使用std::tuple
(C++14) 之类的东西:
template <typename ... Ts>
class MultiStack
{
public:
template<typename T>
const T& Get() const
{
return GetContainer<T>().back();
}
template<typename T>
void Push(const T& t)
{
GetContainer<T>().push_back(t);
}
template <typename T>
void Pop()
{
GetContainer<T>().pop_back();
}
private:
template <typename T>
const std::vector<T>& GetContainer() const { return std::get<std::vector<T>>(Containers); }
template <typename T>
std::vector<T>& GetContainer() { return std::get<std::vector<T>>(Containers); }
private:
std::tuple<std::vector<Ts>...> Containers;
};
推荐阅读
- node.js - 如何使用 google-spreadsheet npm 包在标题行下方的现有行之上添加一行?
- bash - 从 GNU Make 中的子 bash 脚本导出环境变量
- authentication - 无法登录Jenkins-无效的用户名或密码错误
- django - Django 存储:使用 2 个媒体源
- swift - 从 NFC mifare 标签 iOS 13 读取 UID
- java - 如何将 QueryDSL 中的动态查询转换为 JOOQ?
- php - PHP + Curl:协商身份验证时连接关闭(HTTP 1.0?)
- sql - 如何从查询中删除特定列 ColdFusion 11
- graphite - 石墨网,如何添加功能?互联网上缺少按钮?
- c# - 通过域而不是 IP 连接到 SFTP 失败