我正在尝试编写一个与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 - 错误消息有点令人困惑)
答案 0 :(得分:1)
您可以编写一个代码生成器,创建一个专门用于所有需要类型的type_string
模板,并使用该模板获取字符串。我想不出任何其他不需要完整定义的方式。
答案 1 :(得分:0)
好的,我发现了一些可能性;但希望其他人能提出更好的答案。
使用宏来创建extern,因为#token可以获取名称,它应该很容易将此字符串传递给模板。
如果我真的不关心抛出的字符串,我可以typeid(T*)
,因为那显然不需要这种类型。