2015-12-25 15 views
7

Şablon varsayılanı durumunda, argüman olarak aldıkları her şeyden başka bir şey yapmayan bir işleve ihtiyacım var. Özellikle referanslar, konstrüksiyon vb. Korunmalıdır. transparent(/* something */) yazımı, /* something */ yazılmasına tamamen eşdeğer olmalıdır.İşlev iletme argümanı ve basitçe hiçbir şey yapmıyor

Bu amaç için aşağıdaki işlev tanımı doğru mu?

template <class S> 
decltype(auto) transparent (S && s) { return std::forward<S> (s); } 
+0

Uygulamanın doğru olduğunu düşünüyorum. Ama amacı nedir? Temelde std :: forward' olarak yeniden adlandırdınız. –

+0

'template struct Dönüştürme {/ * operatörü() hiçbir şey yapmamalıdır * /}; template <> struct Dönüştürme {MyOtherType işleci() (MyType t) {return wrap (t); }; '. 'Dönüş Dönüşümü {} (/ * fonksiyonum ne olursa olsun * /); – JohnB

cevap

3

bir constexpr ekleyin ve gets o kadar iyidir: şablonlarında ileri :: std Yaygın bir kullanım böyle bir warpper etmektir. pr değerleri, xvalues ​​verecektir; Ancak, aşırı yük çözünürlüğünü kullanarak prvalues ​​ve xvalues'i ayırt edemediğinden bu durum geliştirilemez.

0 null işaretçi sabiti veya dize hazırlayıcıları başlatıcı olarak doğru bir şekilde iletemezsiniz, ancak bunu başarmanın tek yolu bir makro olur (bu sizin için değil).

2

Uygulamanız iyi, ama burada akla gelen gereken bazı noktalar şunlardır: Eğer

bir çağrı, bir rvalue std geçer :: dize, daha sonra std çıkarılabilir olan) (saydam: : string ve std :: forward, bir rpeue referansının döndüğünü garanti eder. şeffaf yapılan bir çağrı() const lvalue std :: string geçerse

ardından S :: const std :: string & ve std çıkarılır ileri referans lvalue bir const dönecektir sağlar

) (saydam yapılan bir çağrı, bir const olmayan lvalue std :: string, geçerse sonra S :: std için çıkarılabilir dize & ve std :: ileri const olmayan lvalue referans dönecektir kalmasını sağlar

Ama neden buna ihtiyacınız var?

template<class T> 
void wrapper(T&& arg) 
{ 
    foo(std::forward<T>(arg)); // Forward a single argument. 
} 
+0

gibi bir fonksiyonda kullanmak istiyorum. Parametre (metafonksiyonun parametresi) bir tür ise, ileriye doğru giden bir metafonta ihtiyacım var ve parametresi başka bir tür ise başka bir şey yapar. Metafunction parametresi ilettiğim ifadenin türü ile ilgisi yoktur. – JohnB