【问题标题】:Obtaining the type-name of a template type, without class definition获取模板类型的类型名称,无需类定义
【发布时间】: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,这实际上很有趣。现在我们还有一个问题:标准是否允许这样做?

标签: c++ boost c++11


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    1. 使用宏来创建 extern,因为 # 标记可以获取名称,所以应该很容易将这个字符串添加到模板中。

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

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多