假设我想编写一个通用函数
实现这个的一种方法是使用标签分发模式,就像标准库在迭代器类别中所使用的那样。
一种替代方法是使用部分特化类型的静态成员函数:
void f<T>()
,如果T
是POD类型,则执行一件事,如果T
是非POD类型(或任何其他任意谓词),则执行另一件事。实现这个的一种方法是使用标签分发模式,就像标准库在迭代器类别中所使用的那样。
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);
}
使用一种方法与另一种方法相比有什么优缺点?你会推荐哪种方法?