首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板化多栈实现-如何实现?

模板化多栈实现-如何实现?
EN

Stack Overflow用户
提问于 2020-04-19 05:25:23
回答 1查看 46关注 0票数 0

我需要一个“MultiStack”来获取不同类型的对象,将每种类型放在一个单独的堆栈中。

到目前为止,情况就是这样。开放的问题是:如何处理多个不同T的容器

代码语言:javascript
复制
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;

};

现在,我可以使用旧的技巧,将容器放入一个成员函数中,例如

代码语言:javascript
复制
template<typename T>
auto GetContainer()
{
    static std::vector<T> C;
    return C;
}

但在多线程时代我再也不喜欢这样了。这是“危险”,对吗?

有没有更好、更优雅的方法?可以想象,我事先知道允许的类型,如果这有助于实现它的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 06:34:00

,但在多线程时代,我再也不喜欢这样了.这是“危险”,对吗?

问题不是多线程。初始化就可以了。但是,您仍然必须保护/同步访问,作为常规多线程代码。

问题是容器不是MultiTask的每个实例,因为它是静态的。很大程度上,MultiTask就像是一个单身的人。

可以想象,我事先知道允许的类型,如果这有助于实现它的话。

这很有帮助,然后您可以使用std::tuple,类似于(C++14):

代码语言:javascript
复制
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;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61299941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档