我有一个棘手的主张。
我想创建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);
答案 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;
}