A для чтения альтернатива [boost|std]::enable_if
, теги и частичная специализация для простой отправки во время компиляции, которая мне нравится, следующая:
[Помните, что логические значения имеют преобразование в целые числа, что массивы нулевой длины недопустимы, а шаблоны с ошибками отбрасываются (SFINAE). Также char (*)[n]
является указателем на массив n
элементов.]
template <typename T>
void foo(T, char (*)[is_pod<T>::value] = 0)
{
// POD
}
template <typename T>
void foo(T, char (*)[!is_pod<T>::value] = 0)
{
// Non POD
}
Он также имеет то преимущество, что не нуждается во внешних классах, которые загрязняют пространство имен. Теперь, если вы хотите экстернализовать предикат, как в вашем вопросе, вы можете сделать:
template <bool what, typename T>
void foo(T, char (*)[what] = 0)
{
// taken when what is true
}
template <bool what, typename T>
void foo(T, char (*)[!what] = 0)
{
// taken when what is false
}
Использование:
foo<std::is_pod<T>::value>(some_variable);