2017-03-24 8 views
2

テンプレートクラスには、戻り値の型がテンプレート引数に基づいたメソッドを持つ必要があります。この例では、K=0の場合はint(コピー)、K=1の場合はint&(返信)を返す関数を作成するにはどうすればよいですか?いくつかのテンプレート引数に基づいて、テンプレートクラスメソッドの戻り値の型にどのように影響を与えることができますか?

template<typename T, int K> 
class someclass 
{ 
public: 
    someclass() : member(3) { } 
    T giveback() { return member; } // if K=0 should return by T, else return by T& 
private: 
    T member; 
}; 

int main() 
{ 
    someclass<int,0> x; 
    x.giveback(); 
} 
+0

テンプレートの特殊化が可能であることはわかっています。しかし、これを達成する他の方法はありますか? – dani

+0

あなたに特化した何かに代理してください。 –

答えて

6

あなたはこれを行うことができます:0である

typename std::conditional<K, T&, T>::type giveback() { return member; } 

K場合、タイプがそれ以外の場合はT&になります、Tになります。

std::conditionalはテンプレート特化を使用して実装されているため、実際には「テンプレート専用」はありません。 std::conditionalを使用すると、テンプレートの特殊化をローカライズし、クラス全体の大部分を複製する必要がなくなります。

+0

"...あなたのクラス全体の大部分を複製する必要はありません。"これは私が意味していたものです。 – dani

+1

私はそれはまた、より多くのsuccint 'std :: conditional_t'があることに言及する価値があると思った: ' std :: conditional_t giveback() } ' –

関連する問題