代码之家  ›  专栏  ›  技术社区  ›  porgarmingduod

模板类的对象创建包装器

  •  2
  • porgarmingduod  · 技术社区  · 15 年前

    给定一个这样的模板类:

    template <typename TYPE>
    class SomeClass {
     public:
      typedef boost::intrusive_ptr<SomeClass<TYPE> > Client_t;
      inline Client_t GetClient() { return Client_t(this); }
    };
    

    someClass只能通过someClass::getClient()返回的指针引用使用。这使得围绕这样的创建编写包装函数变得很自然:

    template <typename TYPE>
    SomeClass<TYPE>::Client_t New_SomeClass() { 
      return (new SomeClass<TYPE>)->GetClient(); 
    }
    

    根据GCC 4.4编译上述代码:

    SomeClass<int>::Client_t some_class = New_SomeClass();
    

    给出错误“在该范围内未声明__new_someClass_”

    现在我不是模板向导,所以这里有一些我不知道的细节,但是我猜我不能使用这样的结构,因为C++不允许在返回类型上重载。

    我猜… 颤抖 …宏将解决此问题:

    #define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient())
    
    auto some_class = NEW_SOMECLASS(int);
    

    但是必须有一种合理的方法来公开模板类的对象创建,而不使用宏或其他繁琐的构造?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Roger Pate    15 年前
    SomeClass<int>::Client_t some_class = New_SomeClass<int>();
    

    因为新类的模板参数不依赖于函数参数,所以必须指定它们。但是,对于这个问题,您报告的错误消息有点奇怪,因此您可能还有其他问题。

    或者,我的偏好而不是新的类函数:

    template<class T>
    struct SomeClass {
      typedef boost::intrusive_ptr<SomeClass> Client;
      inline Client client() { return Client_t(this); }
    
      static Client create() { return (new SomeClass())->client(); }
    
    private:
      SomeClass(); // can be public too, if you really need it accessible
    };
    
    //...
    SomeClass<int>::Client some_class = SomeClass<int>::create();
    

    尽管它本质上只是将函数“移入”类,但我发现它通常更干净。

    在任何情况下,如果编译器支持0x的“auto”,则可以使用它:

    auto some_class = SomeClass<int>::create();
    
        2
  •  0
  •   user204724    15 年前

    您可以尝试使用模板类型参数的默认类型