一意のテンプレート関数を区別するために使用される署名と、一意の関数(テンプレート関数からインスタンス化されたものを含む)を区別するために使用される署名の間に非対称性があることに気付きました。
特に、リターンタイプのみが異なるテンプレート関数は一意であると見なされ、リターンタイプのみが異なるテンプレート関数は冗長であると見なされます。
したがって、インスタンス化の時点で、戻り値のタイプのみが異なる関数テンプレート間で曖昧さを解消する方法について、対応する質問があります。
#include <iostream>
template<typename T>
long foo(T)
{
std::cout << "long" << std::endl;
return 0;
}
template<typename T>
char foo(T)
{
std::cout << "char" << std::endl;
return '\0';
}
int main()
{
double d = 0.0;
long n = foo(d); // <- Ambiguous: How to specify the template function to use?
}
上記のコードでは、テンプレート関数のインスタンス化は、foo
先ほど述べた非対称性のためにあいまいです。2つのテンプレート関数定義の存在は有効ですが、戻り型が同じコード行で指定されている場合でも、インスタンス化は無効です。
私は純粋に理論的な学習目的でこの質問をしています。おそらく、このコード構成は、実際には、不十分な設計の兆候である可能性があります。おそらく、それは現実の世界では決して起こらないでしょう。また、テンプレート定義を変更する(または他の変更を行う)ことで、この問題を克服するさまざまな方法を想像することができます。
ただし、それでも、テンプレート定義を変更せずに、インスタンス化の時点でこれら2つのテンプレート関数のあいまいさを解消できるかどうかを知りたいと思います。