模板类的对象创建包装器

时间:2010-01-20 08:42:06

标签: c++ templates

给出一个模板类:

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 个答案:

答案 0 :(得分:2)

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

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

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

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();

答案 1 :(得分:0)

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