問題: C++11 でプログラムを開発しています。右辺値参照と左辺値参照の両方を受け入れる関数を書きたいです。(つまり、ユニバーサル リファレンス)。
次の関数は、ユニバーサル参照パラメーターを受け入れます。
template<class T> void function(T&& t){/*SNIP*/}
ただし、すべてのタイプのパラメーターを受け入れます。関数の型安全性が損なわれます。特定のタイプのパラメーターを受け入れたい場合はどうすればよいですか?
これが私が考えることができる解決策です:
void function(Class& t){/*SNIP*/}
void function(Class&& t){ function(t); }
しかし、それは醜いです。受け入れるパラメーターを変更したり、関数名を変更したりする場合は、関数の両方のバージョンを更新する必要があります。これよりも優れた同等のものはありますか?
編集:問題は解決しました。お二人ともよく答えてくれました。感謝の気持ちを表すために、両方の回答に +1 を投票しました。この質問は数日間放置します。投票数が最も多い回答が採用されます。
EDIT2:私は次のコードで終わります:
template < class T,
class=typename std::enable_if<std::is_same<Class, typename std::decay<T>::type>::value>::type //Dummy template parameter
>
void function(T&&){}
EDIT3:この目的のためにマクロ定義を書きました:
#define uRefType(T, typeLimit) class T, class=typename std::enable_if<std::is_same<typename std::decay<T>::type, typeLimit>::value>::type
使用例:
template< uRefType(T, Class) > void function(T&&){}