私は次のように書きたいです:
template <typename S, typename T> void foo() {
/* code for the general case */
}
template <typename T> void foo<MySType,T>() {
/* partially specialized code - for any kind of T, but when S is MySType */
}
または、その他の場合は、次のとおりです。
template <typename S, typename T> void bar(const S& a, const T& b) {
/* code for the general case */
}
template <typename T> void bar<MySType,T>(const MySType& a, const T& b) {
/* partially specialized code - for any kind of T, but when S is MySType */
}
C ++(11)ではこれを実行できません。
今、私はこの質問とその答えを読みました; 部分的なテンプレートの特殊化がない理由の説明を購入したとしましょう(または、私が現実に住んでいて、実際にコードを書きたいと思っているだけです)。代わりに、私は何をしますか?
それが絶対に私の最後の手段でない限り、私は実際にはこれらの関数をクラスでラップしたくありません。
もう1つのオプションは、部分的な特殊化を実行できるヘルパークラステンプレートを使用し、部分的に特殊化する必要のないラッパー関数を使用して非表示にすることです。
#include <iostream>
template<typename S, typename T>
struct foo_helper {
void foo() {
std::cout << "general func" << std::endl;
}
};
struct MyType {};
template <typename T>
struct foo_helper <MyType,T> {
void foo() {
std::cout << "partially specialized code - for any kind of T, but when S is MyType" << std::endl;
}
};
template<typename S, typename T>
void foo() {
foo_helper<S, T>().foo();
}
int main () {
foo<int, int>();
foo<int, double>();
foo<MyType, long>();
}
これはC ++ 98/03でも有効です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加