C ++模板矢量操作霸主

时间:2014-05-17 20:16:10

标签: c++ templates vector

我有一个棘手的主张。

我想创建typedef std::vector<T*> BasicVector;

的模板

这是因为我想重载一个适用于所有基本向量的方法

sf::Packet& operator <<(sf::Packet& packet, BasicVector& p);

这并不是很有效...我如何完成这样的事情?

typedef template<typename T> std::vector<typename T*> BasicVector;

或者类似

sf::Packet& operator <<(sf::Packet& packet, std::vector<T*>& p);

2 个答案:

答案 0 :(得分:2)

有关

typedef template<typename T> std::vector<typename T*> BasicVector;

您需要alias template

template<class T> using BasicVector = std::vector<T*>;

但您仍然无法将 BasicVector 传递给某个功能。它只是缩短了。对于std :: vector&lt;例如,int *&gt;,您将编写BasicVector&lt; INT&GT;

而且,是的,用运营商&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;是make运算符&lt;&lt;模板

因此,完整的解决方案是:

template<class T> using BasicVector = std::vector<T*>;

template<typename T>
sf::Packet& operator <<(sf::Packet& packet, const BasicVector<T>& v)
{
    packet << (uint32_t)v.size();

    // Or typename BasicVector<T>::value_type elem
    std::for_each(v.cbegin(), v.cend(), [](T* elem)
        {
            // *it is a pointer elem. Are you sure you need a pointer ?
            packet << *elem;    
        });

    return packet;
}

答案 1 :(得分:0)

我所寻找的是这样的。它很微妙但很简单。

它有点混乱,如果我们可以输入std::vector<T*>,那就太好了,但这并不是什么大不了的事。

// Packs a basic const std::vector into a packet.
template<typename T>
sf::Packet& operator <<(sf::Packet& packet, const std::vector<T*>& v)
{
    packet << (uint32_t)v.size();

    for (typename std::vector<T*>::iterator it = v.begin() ; it != v.end(); ++it)
        packet << *it;

    return packet;
}