使用if ... else语句使用一般Scope声明两种不同类型的变量?

时间:2016-10-16 12:32:28

标签: c++ variables scope scoping

根据条件,我必须声明一个新变量,该变量是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);
}

是否有解决方案或解决方法?

2 个答案:

答案 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;。如果NumericMatrixNumericVar都来自同一个超类,例如您的Object,则可以通过使do_something_with_var()成为带{Object &的常规函数​​来避免代码膨胀。 1}}参数,并将所有特定于子类的功能实现为虚函数。

答案 1 :(得分:0)

第二个&#34;带指针&#34;只要您的类型都来自Object,并且&#34;进一步的代码&#34;仅执行Object支持的操作。如果Object是多态的(例如,它提供了由派生类专门化的virtual函数),那么使用这些虚函数也会起作用。

如果&#34;进一步代码&#34;尝试执行特定于NumericVectorNumericMatrix的任何操作(即不支持或继承自Object),然后这些操作也将无法编译。

如果NumericVectorNumericMatrix支持一组公共操作(有或没有公共基类),您也可以使用模板化函数。

从设计角度来看,我会尝试完全消除NumericVector类型。具有一列的NumericMatrix(可能)是等价的。如果你这样做,你可以做

 NumericMatrix var(n_samples, (condition ? 1 : n_column));

只要您确保后续代码不会直接将n_column传递给var的成员函数。