我想在c ++中做这样的事情(但是因为没有" baseobject"就像在例如JAVA中那样)
double integrate(double(*integrand)(InputData, int), vector<BaseObject>& inputdata){
...
for(...)
value+= integrand(inputdata, someIntVariable);
...
return value;
}
我在inputData
中放置了不同类型的对象,为我的integrand
- 函数输入shuold。然后,我可以将这些值转换为我的integrand-functions
double integrand1(vector<BaseObject> &inputdata, int s){
double d = (double) inputdata.at(1);
char s = (char ) inputdata.at(2);
... do stuff with d ans s
}
我怎样才能以其他方式实现这一目标?
编辑我理解为什么按值传递矢量并不是一个好主意,我只是想表明我需要为不同的整数提供不同数据的集合。
我可以解释一下我的功能目标是什么:我想做一般的集成功能,所以我可以通过一般的&#34; integrand&#34;我的功能然后以数字方式集成。但是,不同的积分需要完全不同的输入数据(比如可能有些需要4x4矩阵等)。
答案 0 :(得分:0)
在java中,比int更复杂的东西是引用。在C ++中,默认情况下对象不是引用。这使得无法在向量中存储不同的对象,因为每个对象类型将需要不同的空间来存储它(向量连续存储对象)。
要实现你想要的东西,你必须使用指针(一个更通用的参考版本,因为你可以在指针上执行指针数学运算)。使用void *的向量没有任何问题,但是你可能最好为你想要存储在向量中的所有对象使用公共基类,因为在处理对象之前需要某种方法来找出类型(C ++的RTTI非常有限)。
答案 1 :(得分:-1)
使用boost::any。
vector<boost::any> inputdata
答案 2 :(得分:-2)
C ++的方法是使用模板:
template<typename integrand_type, typename inputdata_type>
double integrate(integrand_type &&integrand, const inputdata_type &inputdata){
...
for(...)
value+= integrand(inputdata, someIntVariable);
...
return value;
}
...假设inputdata
应该是某种类型的常量容器。另外,您确实理解通过值传递矢量作为函数参数可以生成矢量的完整副本,对吧?这就是你需要参考的原因。
Java对象与C ++对象完全不同。在Java中,当您引用对象时,您实际上是引用指向对象的指针。 Java中的所有对象都是引用。在C ++中,你必须明确你想要什么,否则你最终会产生非常低效的代码。