2016-04-01 28 views
4

Mükemmel yönlendirme genellikle şablon sınıfları bağlamında görülür. Şablon olmayan bir sınıf için, örn. kurucu bir şablon yöntemi böylece mükemmel yönlendirme kullanabilirsiniz? Aşağıdaki gibi bir şey:Şablon olmayan sınıflar için mükemmel yönlendirme

class Foo() 
{ 
    public: 
     template<typename T> 
     Foo(T &&vec) : memberVec(std::forward<T>(vec)) {}; 

    private: 
     std::vector memberVec; 
}; 

avantajları temelde aynıdır, ancak biz gerçek sınıf türünü bildiğinizde şey farklıdır? Bu ne zaman iyi bir uygulama olur ve ne zaman olmaz?

cevap

5

Açıkça ifade edilmeyen tek bağımsız değişken bir küme dönüştürücü bir araçtır. Foo'un bir vektörden dönüştürülebilmesi (bu doğru olabilir) olmadığında, explicit yapmalısınız.

Genel olarak, bir bağımsız değişkenler ile SFINAE devre dışı bırakmak için Foo türlerini eşleştirmeniz gerekir. Kapsayıcı Foo&& ve Foo const& ctors, Foo, Foo& (in, const olmayan bir lvalue) ile şablon ctor'unuzdan çağırdığınızda daha da kötü eşleşir. Basit bir class=std::enable_if_t<!std::is_same<std::decay_t<T>,Foo>> yeterlidir.

Biraz daha fazla kod oluşturulacak. Bu durumda

, std::vector<X> çok

Foo(std::vector<X> vec):memberVec(std::move(vec)) {} 

etkin ve daha net olarak% 99 olan, hareket gülünç ucuz.

Kullandığınız her zamanki mükemmel yönlendirme hataları geçerlidir. Yukarıdaki örnekte bunlara sahip değil - Foo x({1,2,3}) yapabilir ve vec'u oluşturmak için {1,2,3} geçer. T&& ile değil, çünkü ne T ne olduğunu çıkaramazsınız.

+0

Vektörün kopyalanması ucuz olduğunu nereden biliyorsunuz? Vektör, binlerce X. – Vincent

+0

@vinc sabit içerebilir. Maalesef yazım hatası/yazım hatası. – Yakk

İlgili konular