假设我想编写一个通用函数,如果是 POD 类型void f<T>()
,它会做一件事,如果是非 POD(或任何其他任意谓词),它会做另一件事。T
T
实现这一点的一种方法是使用标签调度模式,就像标准库对迭代器类别所做的那样:
template <bool> struct podness {};
typedef podness<true> pod_tag;
typedef podness<false> non_pod_tag;
template <typename T> void f2(T, pod_tag) { /* POD */ }
template <typename T> void f2(T, non_pod_tag) { /* non-POD */ }
template <typename T>
void f(T x)
{
// Dispatch to f2 based on tag.
f2(x, podness<std::is_pod<T>::value>());
}
另一种方法是使用部分专用类型的静态成员函数:
template <typename T, bool> struct f2;
template <typename T>
struct f2<T, true> { static void f(T) { /* POD */ } };
template <typename T>
struct f2<T, false> { static void f(T) { /* non-POD */ } };
template <typename T>
void f(T x)
{
// Select the correct partially specialised type.
f2<T, std::is_pod<T>::value>::f(x);
}
使用一种方法相对于另一种方法的优缺点是什么?你会推荐哪个?