我有一个适用于所有可能的类型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
有关。
话虽这么说,我觉得全班专业将是a肿的。有更好的解决方案吗?
答案 0 :(得分:1)
当foo
为T2
时,您可以使用std::is_same
在char
中执行其他操作:
void foo(T1 t1, T2 t2) {
if (std::is_same<T2, char>::value)
std::cout << "char";
else
std::cout << "not char";
}
您不需要Basic
的完全专业化,甚至不需要foo
的专业化。
这里是demo。
从c ++ 17开始,您甚至可以避免编译不需要的分支(即,仅当char
为T2
时编译char
分支,反之亦然) ,使用if constexpr
,如下所示:
if constexpr (std::is_same<T2, char>())
这里是demo。
答案 1 :(得分:1)
您可以使用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";
}