2015-12-25 15 views
7

テンプレートのデフォルトの場合、引数として受け取ったものを単に転送するだけの機能が必要です。具体的には、参考文献、定数などを保存する必要があります。 transparent(/* something */)を書くことは、/* something */と完全に同じです。引数を引き渡して単純に何もしない

この目的を達成するために、次の関数定義が正しいですか?

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

私は実装が正しいと思います。しかし、目的は何ですか?基本的に 'std :: forward'の名前を変更しました。 –

+0

'template struct Transform {/ * operator()は何もしない* /};テンプレート<>構造体変換 {MyOtherType演算子()(MyType t){return wrap(t);} }; '。 'return Transform {}(/ *私の関数が* /を計算しても何でも); – JohnB

答えて

3

constexprを追加し、それが恋愛小説家です。 prvaluesはxvaluesを生成します。しかし、これは、過負荷解決を使用してprvalueとxvaluesを区別できないため、改善できません。

0をヌルポインタ定数または文字列リテラルとしてイニシャライザとして正しく転送することはできませんが、これを達成する唯一の方法はマクロ(これはあなたの目的ではありません)です。

2

あなたの実装は結構ですが、ここで気になることがいくつかある:

透明()の呼び出しは右辺値のstd ::文字列を渡した場合、 がSTDに推測されます。 :string、std :: forwardは、参照値が 参照を返すことを保証します。透明の呼び出しは()constは左辺値のstd ::文字列を渡した場合

は、その後、S は::のconstのstd ::文字列&、とstdに推定される前方参照左辺値 のconstが返されることを保証する

)(透明への呼び出しは非const左辺値のstd ::文字列を、合格した場合 そしてSは::はstdと推定された文字列&、とstd ::前方には 非const左辺値参照が返されることが保証され

しかし、なぜこれが必要ですか?テンプレートで前方:: STDへの一般的な用途は、そのようなwarpperにある:

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

その関数のパラメータ(メタ関数のパラメータ)が1つの型であれば、フォワードを行うメタ関数が必要ですそのパラメータが別の型であれば何か他のことを行います。メタ関数のパラメータは、転送している式の型とは無関係です。 – JohnB

関連する問題