テンプレート化されたクラスの部分的な特殊化については多くの助けを見つけることができますが、テンプレート化されていないクラスのメソッドを部分的に特殊化したいと思います。
class TempMembMeth {
public:
template<typename T1, typename T2>
void templMethod1(int);
};
私のテンプレート化されたメソッドの実装:
template<typename T1, typename T2>
void TempMembMeth::templMethod1(int){
std::cout << "<T1,T2>templMethod1(int)" << '\n';
}
私は完全にメソッドを指定できますOK:
template<>
inline void TempMembMeth::templMethod1<char,char>(int){
std::cout << "<char,char>templMethod1(int)" << '\n';
}
しかし、どうすれば部分的な指定を行うことができますか?
template<typename T2>
inline void TempMembMeth::templMethod1<char,T2>(int){
std::cout << "<char,?>templMethod1(int)" << '\n';
}
次のようになります。'TempMembMeth:: templMethod1 ':明示的なテンプレート引数の不正使用クラスがテンプレート化されていないため、部分的に特殊化されたメソッドでクラスを再定義できません。また、クラス内のテンプレート化されたメソッドを「オーバーロード」することもできません。ここでも、明示的なテンプレート引数の不正使用について不平を言います。
それで、これが可能であるならば、何か考えはありますか?今のところ、クラスをテンプレート化することでそれを回避しましたが、テンプレート化されたクラスなしでこれが可能かどうか疑問に思いました。
他の人がすでに述べたように、関数テンプレートを部分的に特殊化することはできません。ただし、ほぼ同等の効果を持つヘルパークラスを使用できます。
#include <iostream>
namespace details
{
// Forward declaration of the helper class.
template<typename T1, typename T2> struct Helper;
}
class TempMembMeth
{
public:
template<typename T1, typename T2>
void templMethod1(int arg)
{
details::Helper<T1, T2>::doit(this, arg);
}
};
namespace details
{
// Implement the helper class and its specializations.
template<typename T1, typename T2> struct Helper
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<T1,T2>::doit()\n";
}
};
template<typename T2> struct Helper<char, T2>
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<char,T2>::doit()\n";
}
};
template<> struct Helper<char, char>
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<char, char>::doit()\n";
}
};
}
int main()
{
TempMembMeth obj;
obj.templMethod1<float, int>(10);
obj.templMethod1<char, double>(20);
obj.templMethod1<char, char>(30);
return 0;
}
出力:
In Helper<T1,T2>::doit()
In Helper<char,T2>::doit()
In Helper<char, char>::doit()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加