As looking into libraries, stackoverflow questions and articles on the web, it turns out there are two main way in C++11 to create template specializations (partial if needed) of the same functionality for different types:
function template with SFINAE return type
namespace detail
{
template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type
compute_thing(T n)
{
return T(0);
}
template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
compute_thing(T n)
{
return T(1);
}
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>(n);
}
struct/class template with SFINAE partial specialization
namespace detail
{
template <class T, class Enable = void>
struct compute_thing;
template <class T>
struct compute thing<T, typename std::enable_if<std::is_integral<T>::value, T>::type>
{
static T call(T x)
{
return T(0);
}
}
template <class T>
struct compute thing<T, typename std::enable_if<std::is_floating_point<T>::value, T>::type>
{
static T call(T x)
{
return T(1);
}
}
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>::call(n);
}
However it's not clear:
- Which style should be preferred and why?
- What are the advantages/disadvantages in terms of reusability, versatility, compile-time and runtime performance?
Aucun commentaire:
Enregistrer un commentaire