仅特化 class 模板的一种方法
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
中可能有很多不同的数据成员和方法,它们不一定与函数 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
.
的专业化
这是一个 demo。
从 c++17 开始,您甚至可以避免编译不需要的分支,(即仅当 T2
为 char
时才编译 char
分支,反之亦然反之亦然),使用 if constexpr
,像这样:
if constexpr (std::is_same<T2, char>())
这是一个 demo。
您可以使用 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";
}
我有一个 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
中可能有很多不同的数据成员和方法,它们不一定与函数 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
.
这是一个 demo。
从 c++17 开始,您甚至可以避免编译不需要的分支,(即仅当 T2
为 char
时才编译 char
分支,反之亦然反之亦然),使用 if constexpr
,像这样:
if constexpr (std::is_same<T2, char>())
这是一个 demo。
您可以使用 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";
}