質問

なぜこれの出力があるのか コード :

#include <iostream>  
template<typename T> void f(T param) 
{ 
   std::cout << "General" << std::endl ; 
} 
template<> void f(int& param) 
{ 
   std::cout << "int&" << std::endl ; 
}  

int main() 
{   
  float x ;  f (x) ;   
  int y ; f (y) ;   
  int& z = y ; f (z) ; 
}  

全般的
全般的
全般的

3番目のものは驚くべきものです。なぜなら、機能は正確に特化していたからです int&

編集:オーバーロードが適切な解決策かもしれないことを知っています。その背後にあるロジックを学びたいだけです。

役に立ちましたか?

解決

両方の式のタイプ y そして表現 zint. 。式に表示される参照は、参照タイプを保持しません。代わりに、式のタイプは参照されるタイプであり、式はlvalueです。

どちらの場合も、 T に推測されます int, 、したがって、明示的な専門化はまったく使用されません。

注意が重要なのは、別の人が言ったように、本当に過負荷を使用する必要があることを除く)は、テンプレートに非参照関数パラメーターがあることです。の控除の前 T 引数タイプが実行されると、引数タイプは配列から最初の要素へのポインターに変換されます(関数の場合、引数は関数ポインターに変換されます)。したがって、非参照関数パラメーターを備えた関数テンプレートでは、とにかく正確な控除はできません。

他のヒント

参照は単なるエイリアスであり、タイプではありません。したがって、f(z)を呼び出すと、最初のバージョンとt = intと一致します。これは、t = int&のより良いオプションです。 T&にT&に変更すると、INTとINTと引数の両方が2番目のバージョンを呼び出します。

私はそれが答えではないことを知っていますが、私見では、あなたはこれを試すことができます。

template<typename T>
struct value_traits
{
    static void print(){std::cout << "General" << std::endl ;} 
};

template<>
struct value_traits<const long>
{
    static void print(){std::cout << "const long" << std::endl ;} 
};

template<>
struct value_traits<std::vector<unsigned char> >
{
    static void print(){std::cout << "std::vector<unsigned char>" << std::endl ; }
};

template<>
struct value_traits<const int>
{
       static void print(){std::cout << "const int" << std::endl ;} 
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top