これは std::enable_if の適切な使用ですか? それは機能しますが、正しいですか?
//*.h file
template <typename T>
static typename std::enable_if<std::is_integral<T>::value, T>::type
randomFrom(const T min, const T max);
template <typename T>
static typename std::enable_if<std::is_floating_point<T>::value, T>::type
randomFrom(const T min, const T max);
.
//*.inl file
template <typename T>
inline typename std::enable_if<std::is_integral<T>::value, T>::type
Math::randomFrom(const T min, const T max)
{
static std::default_random_engine re((unsigned long)time(0));
std::uniform_int_distribution<T> uni(min, max);
return static_cast<T>(uni(re));
}
template <typename T>
inline typename std::enable_if<std::is_floating_point<T>::value, T>::type
Math::randomFrom(const T min, const T max)
{
static std::default_random_engine re((unsigned long)time(0));
std::uniform_real_distribution<T> uni(min, max);
return static_cast<T>(uni(re));
}
よりクリーンなインターフェースを実現するために、どのように書き直すことができますか? お気に入り:
template <typename T>
static T randomFrom(const T min, const T max);
ところで、ブーストを使用すると、次のようなものがありました:(ブーストを使用したくない)
typedef typename boost::mpl::if_<
boost::is_floating_point<T>,
boost::uniform_real<>,
boost::uniform_int<>>::type dist_type;
全体の動作は単一の機能で解決されました。でも、そんなことないstd::if
ですよね?