我有一个类模板,对于所有可能的类型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
}
};
问题是,模板类中可能有很多不同的数据成员和方法。Basic
,不一定与函数 foo
.
说到这里,我感觉全班人专职会很臃肿。有没有更好的解决方案?
你可以使用 std::is_same
转而 foo
当 T2
是 char
:
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开始,你甚至可以避免编译不需要的分支,(例如编译 char
枝 T2
是 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";
}