がPODタイプのvoid f<T>()
場合は1つのことを行い、非POD(またはその他の任意の述語)の場合は別のことを行うジェネリック関数を作成するとします。T
T
これを実現する1つの方法は、標準ライブラリがイテレータカテゴリで行うように、タグディスパッチパターンを使用することです。
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);
}
ある方法を他の方法よりも使用することの長所と短所は何ですか?どちらをお勧めしますか?