我在整个项目/类中继承了这个小实用程序类(模板化)。
这个想法是它允许轻松地将各种成员打包到类实例中和从类实例中打包出来(对于网络等,并不完全重要)
我得到的结果如下
template<typename T>
struct Packable
/**
* Packs a <class T> into a Packet (Packet << T)
* Required for chaining packet packing
*************************************************/
virtual sf::Packet& operator <<(sf::Packet& packet) = 0; // Work-horse, must be defined by child-class
friend sf::Packet& operator <<(sf::Packet& packet, const T *t)
{
// Call the actual one, but basically do nothing...
return packet << *t;
}
friend sf::Packet& operator <<(sf::Packet& packet, const T &t)
{
// Call the actual one, but basically do nothing...
return packet << &t;
}
friend sf::Packet& operator <<(sf::Packet& packet, T *t)
{
// Call the actual one, but basically do nothing...
return packet << *t;
}
friend sf::Packet& operator <<(sf::Packet& packet, T &t)
{
// Call the actual one, but basically do nothing...
return packet << &t;
}
};
简而言之,我正在尝试做的是让它只需要在子类中指定/充实一种方法(用“虚拟”一词表示)。
我想要的是提供采用类的各种形式的其他方法,并根据需要取消引用它们以使用编译类时将存在的虚拟方法。
问题是我似乎创建了一些无限循环。
friend sf::Packet& operator <<(sf::Packet& packet, T &t)
{
// Call the actual one, but basically do nothing...
return packet << &t;
}
只是一遍又一遍地调用自己。我如何取消对它的对象的引用?
最佳答案
operator <<
有 4 个重载他们相互依赖。
- const T *,取决于 2
- const T&,取决于 1
- T *,取决于4
- T&,取决于 3
因此引起了无休止的回避。您应该至少将其中一个实现为 independent functionality然后其余的都依赖于此。
你可以像下面那样做
template<typename T>
struct Packable
/**
* Packs a <class T> into a Packet (Packet << T)
* Required for chaining packet packing
*************************************************/
virtual sf::Packet& operator <<(sf::Packet& packet) = 0; // Work-horse, must be defined by child-class
friend sf::Packet& operator <<(sf::Packet& packet, const T *t)
{
// Call the actual one, but basically do nothing...
return packet << *t;
}
friend sf::Packet& operator <<(sf::Packet& packet, const T &t)
{
// Call the actual one, but basically do nothing...
//return packet << &t;
// Serialize the contents into packet stream
t.serialize(packet);
return packet;
}
friend sf::Packet& operator <<(sf::Packet& packet, T *t)
{
// Call the actual one, but basically do nothing...
return packet << const_cast<const T*>(t);
}
friend sf::Packet& operator <<(sf::Packet& packet, T &t)
{
// Call the actual one, but basically do nothing...
return packet << &t;
}
};
这个函数serialize
应在每个 T
中实现输入类,否则你会看到编译时错误。
关于C++ 重载运算符,解引用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881126/