【发布时间】:2011-06-29 16:18:02
【问题描述】:
我正在尝试编写一个适用于smart_ptr 类型的模板包装器,并且在某些情况下需要引发异常。对于这种情况,我想包括类正在包装的类型的名称。由于我正在使用智能指针,因此该类型只能使用前向声明。
所以基本问题是如何在没有可用定义的情况下获取模板参数的字符串? (我不需要一个干净的名字,任何类似名字的都可以)
我尝试使用 typeid 失败了,因为它需要类定义(至少在 GCC 中)。
我基本上需要工作的代码如下(在 GCC 中出现错误)
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
class SomeClass;
void func( shared_ptr<SomeClass> obj );
template<class T>
class Wrap
{
shared_ptr<T> ptr;
public:
shared_ptr<T> get()
{
if( !ptr )
throw std::string(typeid(T).name());
return ptr;
}
};
extern Wrap<SomeClass> wrapSomeClass;
int main()
{
func( wrapSomeClass.get() );
}
(这个设置导致了我之前的错误question——错误信息有点令人困惑)
【问题讨论】:
-
使用智能指针的不完整类型时要小心。如果您使用自己的破坏机制,这可能会导致内存损坏。
-
@mkaes,这实际上很有趣。现在我们还有一个问题:标准是否允许这样做?