根据条件,我必须声明一个新变量,该变量是NumericVector或NumericMatrix,稍后将用于进一步处理。我尝试了以下方法:
if(condition)
{
NumericVector var(n_samples);
}else{
NumericMatrix var(n_samples, n_column);
}
if(condition)
{
#Further code to process var as NumericVector
}else{
#Further code to process var as NumericMatrix
}
return(var)
但我们都知道C++ variables go out scope at the end of the conditional而这正是我所得到的。
Line xxx: var was not declared in this scope
我尝试使用指针但没有成功。
Object *var = NULL;
if(condition)
{
var = new NumericVector Object(n_samples);
}else{
var = new NumericMatrix Object(n_samples, n_column);
}
是否有解决方案或解决方法?
答案 0 :(得分:0)
这就是模板的用途。
template<typename var_type>
void do_something_with_var(var_type &var)
{
// The rest of the code that uses var.
}
// .....
if(condition)
{
NumericVector var(n_samples);
do_something_with_var(var);
} else {
NumericMatrix var(n_samples, n_column);
do_something_with_var(var);
}
如果do_something_with_var()
需要在调用它的范围内使用一些其他对象,变量等,只需将它们作为附加参数传递给do_something_with_var()
。
这也将向您介绍另一个名为&#34;模板代码膨胀的C ++功能&#34;。如果NumericMatrix
和NumericVar
都来自同一个超类,例如您的Object
,则可以通过使do_something_with_var()
成为带{Object &
的常规函数来避免代码膨胀。 1}}参数,并将所有特定于子类的功能实现为虚函数。
答案 1 :(得分:0)
第二个&#34;带指针&#34;只要您的类型都来自Object
,并且&#34;进一步的代码&#34;仅执行Object
支持的操作。如果Object
是多态的(例如,它提供了由派生类专门化的virtual
函数),那么使用这些虚函数也会起作用。
如果&#34;进一步代码&#34;尝试执行特定于NumericVector
或NumericMatrix
的任何操作(即不支持或继承自Object
),然后这些操作也将无法编译。
如果NumericVector
和NumericMatrix
支持一组公共操作(有或没有公共基类),您也可以使用模板化函数。
从设计角度来看,我会尝试完全消除NumericVector
类型。具有一列的NumericMatrix
(可能)是等价的。如果你这样做,你可以做
NumericMatrix var(n_samples, (condition ? 1 : n_column));
只要您确保后续代码不会直接将n_column
传递给var
的成员函数。