私が理解している、非常に貧弱な C++ プログラミング形式であり、おそらく実際には決して使用されるべきではない、エッジ ケース シナリオについてお聞きしたいと思います。ただし、テンプレートの構文を完全に理解していることを確認したいと思います。
私の質問は、単純に、テンプレートの特殊化におけるテンプレート パラメーターの反転に関するものです。私の質問を最も簡潔に示すサンプルコードを次に示します。
#include <iostream>
template<typename T1, typename T2>
class A
{
public:
int foo()
{
return 1;
}
};
template<typename T1, typename T2>
class A<T2, T1> // <-- Arguments reversed in template specialization
{
public:
int foo()
{
return 2;
}
};
int main()
{
A<int, int> a;
std::cout << a.foo(); // Output is "2"; the specialized version is called.
return 0;
}
前述のように、このプログラムを実行すると、出力は "2" になります。テンプレート クラスの特殊化されたバージョンが、テンプレート コンパイラによってインスタンス化されます。
これについて考えると、どのような状況でも、テンプレート クラスの非特殊化バージョンがテンプレート コンパイラによってインスタンス化されるコードを記述することは不可能であると私は信じています。A<first_type, second_type>
テンプレート コンパイラは最初に一致する特殊化を検索し、2 つの引数の特殊化は、型をインスタンス化するすべてのクライアント コード(特に、特殊化されたテンプレートの定義内の構文でfirst_type
対応するもの)に常に一致するため、したがって、特殊化されていないバージョンには、どのような状況でも到達できないというのは本当のようです。T2
template<typename T1, typename T2>
私は正しいですか?そうでない場合、誰かがテンプレート クラス A を使用し、特殊化されていないバージョンのテンプレートをインスタンス化できるクライアント コードを示してもらえますか?