不同类型的模板专业化的最佳方式
Best way of template specializations for different types
在查看库、Whosebug 问题和网络上的文章时,发现在 C++11 中有两种主要方法可以为不同类型创建相同功能的模板特化(如果需要,部分):
具有 SFINAE return 类型的函数模板
#include <type_traits>
namespace detail
{
template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type
compute_thing(T n)
{
// do calculations and return something
}
template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
compute_thing(T n)
{
// do calculations and return something
}
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>(n);
}
struct/class 具有 SFINAE 部分专业化的模板
#include <type_traits>
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)
{
// do calculations and return something
}
};
template <class T>
struct compute_thing<T, typename std::enable_if<std::is_floating_point<T>::value, T>::type>
{
static T call(T x)
{
// do calculations and return something
}
};
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>::call(n);
}
不过不清楚:
- 应该首选哪种样式,为什么?
- 在可重用性、通用性、编译时和运行时性能方面advantages/disadvantages是什么?
如果结果需要一些处理或者 return 一个非常量值,我会使用这个解决方案,使用函数:
template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type compute_thing(T n)
{
return some_integral_calc(n);
}
template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type compute_thing(T n)
{
return some_fp_calc(n);
}
但是如果我能让编译器完成获取我的 const 值的工作(例如通过 constexpr。)我会尽可能使用专门的结构。
https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation
在查看库、Whosebug 问题和网络上的文章时,发现在 C++11 中有两种主要方法可以为不同类型创建相同功能的模板特化(如果需要,部分):
具有 SFINAE return 类型的函数模板
#include <type_traits>
namespace detail
{
template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type
compute_thing(T n)
{
// do calculations and return something
}
template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
compute_thing(T n)
{
// do calculations and return something
}
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>(n);
}
struct/class 具有 SFINAE 部分专业化的模板
#include <type_traits>
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)
{
// do calculations and return something
}
};
template <class T>
struct compute_thing<T, typename std::enable_if<std::is_floating_point<T>::value, T>::type>
{
static T call(T x)
{
// do calculations and return something
}
};
}
template <class T>
T compute_thing(T n)
{
return detail::compute_thing<T>::call(n);
}
不过不清楚:
- 应该首选哪种样式,为什么?
- 在可重用性、通用性、编译时和运行时性能方面advantages/disadvantages是什么?
如果结果需要一些处理或者 return 一个非常量值,我会使用这个解决方案,使用函数:
template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type compute_thing(T n)
{
return some_integral_calc(n);
}
template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type compute_thing(T n)
{
return some_fp_calc(n);
}
但是如果我能让编译器完成获取我的 const 值的工作(例如通过 constexpr。)我会尽可能使用专门的结构。
https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation