[英]Specializing only one method of a class template
我有一個 class 模板,它適用於所有可能的類型 T1、T2。
template <typename T1, typename T2>
class Basic {
int a;
float b;
public:
void foo(T1 t1, T2 t2) {
// use a, b, t1, t2
}
};
但是,有一種情況是T2
是char
,我希望foo
表現不同。
所以我嘗試只專注於該方法:
template <typename T1>
class Basic<T1, char> {
void foo(T1 t1, char t2) {
// try using a, b, t1, t2 in a very special way
// ERROR:
// use of undeclared identifier: a
// use of undeclared identifier: b
}
};
問題是,模板 class Basic
中可能有很多不同的數據成員和方法,它們不一定與 function foo
相關。
話雖如此,我覺得完全的 class 專業化會很臃腫。 有更好的解決方案嗎?
當T2
為char
時,您可以使用std::is_same
在foo
中執行其他操作:
void foo(T1 t1, T2 t2) {
if (std::is_same<T2, char>::value)
std::cout << "char";
else
std::cout << "not char";
}
為此,您不需要Basic
的完全專業化,甚至不需要foo
的專業化。
這是一個演示。
從 c++17 開始,您甚至可以避免編譯不需要的分支(即僅在T2
為char
時編譯char
分支,反之亦然),使用if constexpr
,如下所示:
if constexpr (std::is_same<T2, char>())
這是一個演示。
您可以使用std::is_same<T2, char>
進行分支,例如if (std::is_same<T2, char>::value)
,或者您可以使用標簽調度,如下所示:
public:
void foo(T1 t1, T2 t2) {
foo_impl(t1, t2, std::is_same<T2, char>{});
}
private:
void foo_impl(T1 t1, T2 t2, std::false_type) {
std::cout << "T2 != char\n";
}
void foo_impl(T1 t1, T2 t2, std::true_type) {
std::cout << "T2 == char\n";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.