【发布时间】:2015-01-23 05:11:42
【问题描述】:
我尝试了两件事:
class RandDouble{
public:
RandDouble(double const& min_inclusive, double const& max_exclusive):
mt_(std::random_device()),
dist_(min_inclusive,max_exclusive)
{}
~RandDouble(){}
double get(){ return dist_(mt_); }
private:
std::mt19937_64 mt_;
std::uniform_real_distribution<double> dist_;
};
class RandUnsignedInt{
public:
RandUnsignedInt(unsigned int const& min_inclusive, unsigned int const& max_inclusive):
mt_(std::random_device()),
dist_(min_inclusive,max_exclusive)
{}
~RandUnsignedInt(){}
unsigned int get(){ return dist_(mt_); }
private:
std::mt19937_64 mt_;
std::uniform_int_distribution<unsigned int> dist_;
};
和
template<typename Type>
class Rand{
public:
Rand(Type const& min_inclusive, Type const& max_exclusive);/
~Rand();
Type get();
private:
std::mt19937_64 mt_;
std::uniform_real_distribution<double>* dist_double_;
std::uniform_int_distribution<unsigned int>* dist_u_int_;
};
template<typename Type>
Rand<Type>::~Rand(){
if(dist_double_){ delete dist_double_; }
if(dist_u_int_){ delete dist_u_int_; }
}
使用.cpp 文件:
template<>
Rand<double>::Rand(double const& min_inclusive, double const& max_exclusive):
mt_(std::random_device()()),
dist_double_(new std::uniform_real_distribution<double>(min_inclusive,max_exclusive)),
dist_u_int_(NULL)
{}
template<>
Rand<unsigned int>::Rand(unsigned int const& min_inclusive, unsigned int const& max_exclusive):
mt_(std::random_device()()),
dist_double_(NULL),
dist_u_int_(new std::uniform_int_distribution<unsigned int>(min_inclusive,max_exclusive))
{}
template<>
double Rand<double>::get(){ return (*dist_double_)(mt_); }
template<>
unsigned int Rand<unsigned int>::get(){ return (*dist_u_int_)(mt_); }
从实际的角度来看,模板解决方案与其他模板类更灵活,因为我可以执行以下操作:
template<typename Type>
classs C{
/*some code*/
private:
Rand<Type> r;
};
所以我喜欢模板解决方案。但是当我检查调用Rand<double/unsigned int>::get() 方法所需的时间时,我意识到它所花费的时间是从RandDouble::get() 或RandUnisignedint::get() 调用的时间的两倍多。
有一种方法可以通过调用方法来保持模板方法的灵活性,该调用方法与使用两个不同类的调用方法一样有效。
【问题讨论】:
-
如下所述,问题在于指针间接。 C++ 模板实际上是在预处理器时创建的,并且在后台有效地为您创建了 2/3/4 个类。因此,模板并不比手工工具类慢(取决于实现) 我很好奇的一件事是,我看不到你在类中实际使用 mt_ 的位置,它需要比你正在使用的类型更高精度。换行“std::mt19937_64 mt_;”不合适吗?对于“T mt__;”
-
@chrispepper1989 我在 get 方法中使用 mt_...
std::uniform_real_distribution<double>或std::uniform_int_distribution<unsigned int>都需要它
标签: c++ performance templates c++11