我希望能够使用模板推导来实现以下目标:

GCPtr<A> ptr1 = GC::Allocate();
GCPtr<B> ptr2 = GC::Allocate();

而不是(我目前拥有的):
GCPtr<A> ptr1 = GC::Allocate<A>();
GCPtr<B> ptr2 = GC::Allocate<B>();

我当前的分配函数如下所示:
class GC
{
public:
    template <typename T>
    static GCPtr<T> Allocate();
};

这有可能消除多余的<A><B>吗?

最佳答案

那是不可能的。返回类型不参与类型推导,它是已经匹配了适当的模板签名的结果。但是,您可以将其隐藏为大多数用途,例如:

// helper
template <typename T>
void Allocate( GCPtr<T>& p ) {
   p = GC::Allocate<T>();
}

int main()
{
   GCPtr<A> p = 0;
   Allocate(p);
}

语法实际上是比初始GCPtr<A> p = GC::Allocate<A>()好还是差的另一个问题。

附言c++ 11将允许您跳过以下类型声明之一:
auto p = GC::Allocate<A>();   // p is of type GCPtr<A>

10-06 09:43