参照タイプの専門機能テンプレート
-
10-10-2019 - |
質問
なぜこれの出力があるのか コード :
#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
そして表現 z
は int
. 。式に表示される参照は、参照タイプを保持しません。代わりに、式のタイプは参照されるタイプであり、式は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 ;}
};
所属していません StackOverflow