带有可变参数的c++方法(..)报告不正确的参数值
C++ method with variable arguments (...) reporting incorrect arg values
我在将变量参数正确传递给方法时遇到了麻烦-该方法旨在在加权分布中选择随机值并返回所选结果的索引。
一个例子是:
int pickupType = randomManager->ByWeights( 3, 0.60f, 0.20f, 0.20f );
switch( pickupType ) {
// ... pickupType should be 0 to 2, which we can then branch on
}
函数定义如下:
#include <cstdarg>
int RandomManager::ByWeights( int weightCount, ... ) {
va_list argList;
// Get the total of all weights
va_start( argList, weightCount );
float weightTotal = 0;
for ( int i = 0; i < weightCount; i++ ) {
weightTotal += va_arg( argList, float );
}
va_end( argList );
// Roll a number in that range
// ... (further processing - problem occurs above)
}
当我在调试器中运行它时,对va_arg( argList, float )
的调用返回垃圾值( 2.0, 1.77499998, -1.08420217e-019 )
,而不是在( 0.60f, 0.20f, 0.20f )
中传递的值。
你知道我做错了什么吗?据我所知,我完全遵循了规范。我一直使用http://www.cplusplus.com/reference/cstdarg/作为参考
在variadic函数中,float形参将被转换为double类型。试着
weightTotal += va_arg( argList, double );
问题是float
经过...
后被提升为double
for ( int i = 0; i < weightCount; i++ ) {
weightTotal += va_arg( argList, double );
}
如果你正在使用c++,这不是真正正确的方式来做事情了。可变参数模板比可变参数(来自c)更好。下面是我不久前为类做的可变和的一个更好的例子。
#include <iostream>
namespace cs540 {
template <typename T>
const T & sum(const T & v) {
return v;
}
template <typename T, typename T2, typename ... Ts>
T sum(const T & v, const T2 & w, const Ts & ... params) {
return sum(w+v,params...);
}
}
int main() {
using namespace cs540;
using namespace std;
cout << sum(1.1,2,3,4,6,8,9,1.1) << endl;
}
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- 使用 cvThreshold 时报告参数时出错
- 参数化sc_lv时报告错误(表达式必须具有常量值)
- 将常量引用对象作为参数传递时出现问题,VS 调试器报告"'.getXCoord'左侧必须具有调用/结构/联合"
- 带有可变参数的c++方法(..)报告不正确的参数值
- Snprintf:当第二个参数超过目标内存时,为什么不报告错误