戻り値の型に基づいて関数のテンプレート推論を行うには? 質問する

戻り値の型に基づいて関数のテンプレート推論を行うには? 質問する

テンプレート推論を使用して次のことを実現できるようにしたいと思います。

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

代わりに(現在持っているもの):

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

現在の Allocate 関数は次のようになります。

class GC
{
public:
    template <typename T>
    static GCPtr<T> Allocate();
};

余分な部分を削除することは可能でしょうか<A>?<B>

ベストアンサー1

それはできません。戻り値の型は型推論には関与せず、適切なテンプレート シグネチャにすでに一致した結果です。ただし、次のようにしてほとんどの用途から非表示にすることができます。

// 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>()別の問題です。

PS c++11 では、型宣言の 1 つをスキップできます。

auto p = GC::Allocate<A>();   // p is of type GCPtr<A>

おすすめ記事