获取模板类型的类型名称,不带类定义

时间:2011-06-29 16:18:03

标签: c++ boost c++11

我正在尝试编写一个与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 - 错误消息有点令人困惑)

2 个答案:

答案 0 :(得分:1)

您可以编写一个代码生成器,创建一个专门用于所有需要类型的type_string模板,并使用该模板获取字符串。我想不出任何其他不需要完整定义的方式。

答案 1 :(得分:0)

好的,我发现了一些可能性;但希望其他人能提出更好的答案。

  1. 使用宏来创建extern,因为#token可以获取名称,它应该很容易将此字符串传递给模板。

  2. 如果我真的不关心抛出的字符串,我可以typeid(T*),因为那显然不需要这种类型。