2016-10-16 1 views
-1

条件によっては、後で処理するNumericVectorまたはNumericMatrixのいずれかの新しい変数を宣言する必要があります。if ... elseステートメントを使用して、一般的なスコープで2つの異なるタイプの変数を宣言しますか?

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

あなたの型は 'Object'から派生していますか? –

+0

'new'式の仕組みを見てください。これは基本的な構文エラーのようです。 –

+0

'Object * 'アプローチの問題点は何ですか? – Galik

答えて

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()にそれらをなどの追加パラメータを渡します。

これは、 "template code bloat"という別のC++機能を紹介します。 NumericMatrixNumericVarの両方がObjectのように同じスーパークラスから派生している場合は、do_something_with_var()Object &というパラメータを持つ通常の関数を作成し、すべてのサブクラス固有の機能を仮想関数として実装することでコードの肥大化を回避できます。

0

両方のタイプがObjectから派生し、 "さらなるコード"がObjectでサポートされている操作のみを実行する限り、2番目の "ポインタ付き"は機能します。 Objectがポリモフィックである場合(例えば、派生クラスによって特殊化された関数virtualを提供する場合)、これらの仮想関数の使用も同様に機能します。 「更なるコードが」NumericVectorまたはNumericMatrix(すなわちによってサポートされる、またはObject、から継承されない)のいずれかに特異的である任意の操作を実行しようとした場合

それらの動作はまた、コンパイルされません。

NumericVectorおよびNumericMatrixが共通の基本操作(共通基本クラスの有無にかかわらず)をサポートする場合は、テンプレート関数を使用することもできます。

デザインの観点から、私はNumericVectorタイプを完全に排除しようとします。 1つの列を有するNumericMatrixは(おそらくは)等価であろう。あなたがそれを行う場合は、限り、あなたは、後続のコードが直接varのメンバ関数へn_columnを通過させないことを保証するよう

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

を行うことができます。

+0

"デザインの観点からは、NumericVectorタイプを完全に排除しようとしています.1つの列を持つNumericMatrixは(おそらく)等価になります。私は教授に教えてくれました。コードはそのことを念頭に置いて作成されました。彼はそれが好きではなかったので、ここで私はすべてを書き直すことなく問題を解決する方法を求めています。 – j91

+0

それはあなたとあなたの教授の間です。一般的に言えば、Vectorはしばしば1つの列(または指定した方法に応じた行)を持つ行列です。そのケースを作ることができない場合は、ここで説明した以上の情報があるか、教授に納得していないことを意味します。どちらの方法でもオンラインの人々は問題を解決できません。 – Peter

関連する問題