Объявите два различных типа переменных с общим Scope, используя оператор if … else?

В зависимости от условия, я должен объявить новую переменную, которая является либо 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 ++ переменные выходят за рамки в конце условного и это именно то, что я получаю.

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);
}

Есть ли решение или обходной путь для этого?

-1

Решение

Для этого и нужен шаблон.

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(),

Это также познакомит вас с другой функцией C ++, называемой «раздуванием кода шаблона». Если оба NumericMatrix а также NumericVar происходят из того же суперкласса, как ваш Objectможно было бы избежать раздувания кода, сделав do_something_with_var() регулярная функция, которая принимает Object & параметр и реализовать все специфичные для подкласса функциональные возможности как виртуальные функции.

0

Другие решения

Второй «с указателем» будет работать, если оба ваших типа получены из Objectи «дополнительный код» выполняет только операции, поддерживаемые Object, Если Object является полиморфным (например, обеспечивает virtual функции, которые специализируются производными классами), то использование этих виртуальных функций также будет работать.

Если «дальнейший код» пытается выполнить какие-либо операции, относящиеся к NumericVector или же NumericMatrix (т.е. не поддерживается или не наследуется, Object) тогда эти операции также не будут компилироваться.

Если NumericVector а также NumericMatrix Поддерживая общий набор операций (с общим базовым классом или без него), вы также можете использовать шаблонную функцию.

С точки зрения дизайна, я бы попытался устранить NumericVector введите полностью. NumericMatrix с одним столбцом (предположительно) будет эквивалентным. Если вы сделаете это, вы могли бы сделать

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

при условии, что последующий код не проходит напрямую n_column в varфункции-члены.

0

По вопросам рекламы [email protected]