Диспетчеризация тегов по сравнению со статическими методами в частично специализированных классах

Предположим, я хочу написать общую функцию void f () , которая выполняет одно действие, если 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);
}

Каковы плюсы и минусы использования одного метода над другим? Что бы вы порекомендовали?

47
задан Aziz Shaikh 5 November 2012 в 05:20
поделиться