В зависимости от условия, я должен объявить новую переменную, которая является либо 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);
}
Есть ли решение или обходной путь для этого?
Для этого и нужен шаблон.
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 &
параметр и реализовать все специфичные для подкласса функциональные возможности как виртуальные функции.
Второй «с указателем» будет работать, если оба ваших типа получены из Object
и «дополнительный код» выполняет только операции, поддерживаемые Object
, Если Object
является полиморфным (например, обеспечивает virtual
функции, которые специализируются производными классами), то использование этих виртуальных функций также будет работать.
Если «дальнейший код» пытается выполнить какие-либо операции, относящиеся к NumericVector
или же NumericMatrix
(т.е. не поддерживается или не наследуется, Object
) тогда эти операции также не будут компилироваться.
Если NumericVector
а также NumericMatrix
Поддерживая общий набор операций (с общим базовым классом или без него), вы также можете использовать шаблонную функцию.
С точки зрения дизайна, я бы попытался устранить NumericVector
введите полностью. NumericMatrix
с одним столбцом (предположительно) будет эквивалентным. Если вы сделаете это, вы могли бы сделать
NumericMatrix var(n_samples, (condition ? 1 : n_column));
при условии, что последующий код не проходит напрямую n_column
в var
функции-члены.