【发布时间】:2013-10-22 13:08:42
【问题描述】:
嘿,这一切希望是一个简单的问题来回答,但这对我来说是全新的,我不知道为什么会这样。取下面的C++代码:
template<class T>
T expo(T a, T b){
T result = 1;
while(b) {
if(b & 1)result *= a;
b >>=1 ;
a *= a;
}
return result;
}
int main() {
cout << std::pow<size_t>(50, 5) << endl;
cout << expo<size_t>(50, 5) << endl;
}
输出是:
3.125e+008
312500000
两者都是正确的,但std::pow() 将输出格式化为科学计数法。它到底是怎么做到的? C++ 一定有一个我一直缺少的特性。救命!
【问题讨论】:
-
不知道
std::pow是一个模板。你确定可以编译? -
您不应该为这些函数显式指定模板参数。
-
@LuchianGrigore:允许但不需要是模板。所以它编译了一些地方,但不是所有地方。
-
@LuchianGrigore - 它不是必须作为模板,如果是,则显式特化它的效果不是由 C++ 标准定义的。
-
@PeteBecker 我怀疑它在
gcc和clang上使用了complex版本,此代码std::cout << typeid( std::pow<size_t>(50, 5)).name() << std::endl;返回d为double。