【问题标题】:Class type from pointer used as template argument来自用作模板参数的指针的类类型
【发布时间】:2010-07-13 10:49:04
【问题描述】:

如果指向用户定义类型的指针作为模板参数传递给模板类,是否可以获得参数的类类型?

template <class T> struct UserType {
    typedef T value_type;
    ...
};

int main () {
    typedef std::vector<UserType<double>*> vecType
    vecType vec;

    vecType::value_type::value_type m; //how to get the double here?

    return 0;
}

【问题讨论】:

    标签: c++ templates pointers


    【解决方案1】:

    使用特征:

    template <typename> struct ptr_traits {};
    template <typename T> struct ptr_traits<T*>
    { typedef T value_type; };
    
    ptr_traits<vecType::value_type>::value_type m;
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我还不是 boost 的忠实粉丝,我不能接受四分之一班轮,即使它是解决我问题的正确方法。还是谢谢。
      • 对于这么简单的事情,我不建议使用 boost。 Boost 的出色之处在于其复杂的库。
      • @Alex 如果你已经使用了 boost,那么对这个东西使用 boost 就可以了。
      【解决方案3】:

      特征可能是这里的方法。

      或者,您可以引入另一个typedef 并在vecTypem 的声明中使用它:

      typedef UserType<double>* UserTypeDoublePtr;
      typedef std::vector<UserTypeDoublePtr> vecType;
      
      UserTypeDoublePtr m;
      

      【讨论】:

      • 我喜欢第二个建议。我认为它不符合实际需要,但我会保护它以备后用。特征工作正常。
      【解决方案4】:

      让我问你“获取”类型是什么意思?

      您实际上可以使用这种类型,例如,您可以声明这种类型的新变量(正如您在示例中所展示的那样),而无需明确指定它。

      你的意思是你想要一个类型的文字描述吗?

      如果是这种情况 - 没有通用的 100% 工作方式。这是因为编译+链接类型和变量/函数名称后消失。它们只是在运行时不存在。

      但是,您可以编写一些额外的代码来获取所需类型的文本描述。一种方法:

      template <typename T> const char* TypeName();
      template <> const char* TypeName<int>() { return "int"; }
      template <> const char* TypeName<double>() { return "double"; }
      // ...
      

      如果您尝试在尚未定义名称的类型上使用TypeName,您将收到链接器错误。然后,您必须添加适当的模板特化 TypeName

      【讨论】:

      • 如示例代码所示,我想使用实际的嵌套类型作为其他变量(,...)的类型。但是指向类型的指针并不完全是类型,因此内部 typedef 不起作用。
      • 哦,我明白了。然后我猜 Alexandre C. 回答了你的问题 :)
      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多