2015-05-08 2 views
1

Вот класс, который может быть вызван с различными типом данных:Как вызвать ту же функцию с другим типом данных?

template<class TDataType> 
void SetProperties(IndexType PropertiesId, 
        const Variable<TDataType>& rVariable, 
        const TDataType& Value) 
{ 
    mpModeler->SetProperties(PropertiesId, rVariable, Value); 
} 

где Modeler :: SetProperties определяется как:

template<class TDataType> 
void SetProperties(IndexType PropertiesId, 
        const Variable<TDataType>& rVariable, 
        const TDataType& Value) 
{ 
    if (mpModel->GetProperties(PropertiesId).get() == 0) 
    { 
     mpModel->AddProperties(PropertiesId, Properties::Pointer(new Properties(*mpModel))); 
    } 

    PropertyFunction<TDataType>::Pointer constant_property(new ConstantProperty<TDataType>(Value)); 

    mpModel->GetProperties(PropertiesId)->SetProperty(rVariable, constant_property); 
} 

Класс SetProperties вызывается:

yyvsp[0].statement_handler->Execute(mpKernel); 

Где Execute() определяется:

template<class TDataType> class GeneratePropertiesStatement : public Statement 
{ 
public: 

    GeneratePropertiesStatement(int Id, 
           const Kratos::Variable<TDataType>& rVariable, 
           const TDataType& Value) : mId(Id), 
                 mVariable(rVariable), 
                 mValue(Value){} 

    void Execute(Kratos::Kernel* pKernel) 
    { 
     pKernel->SetProperties(mId, mVariable, mValue); 
    } 

    int mId; 
    Kratos::Variable<TDataType> mVariable; 
    TDataType mValue; 
}; 

Одиночные данные или несколько данных передаются по стоимости следующих утверждений:

сингл данные:

yyval.statement_handler = new GeneratePropertiesStatement<double>(yyvsp[-4].integer_value, *yyvsp[-2].double_variable, yyvsp[0].double_value); 

, где yyvsp[0].double_value определяется как double;

множественные данные:

yyval.statement_handler = new GeneratePropertiesStatement<Kratos::Vector<double> >(yyvsp[-4].integer_value, *yyvsp[-2].vector_double_variable, *yyvsp[0].vector_double_value); 

, где *yyvsp[0].vector_double_value определяется как vector.

Однако вышеуказанное осуществление зависит от некоторых внешних данных, и мне нужно напрямую вызвать функцию SetProperties. Я определил следующий аргумент и успешно называется функцией:

int i; 
const Kratos::Variable<double>* double_variable; 
double regionmapi; 
... 
pKernel->SetProperties(i, *double_variable, regionmapi); 

Однако, когда я определил следующий аргумент и называется функцией передать несколько данных, это не удалось:

double tmp3[3]; 
std::vector<double>aa; 
for (int i = 0; i < 3; i++)aa.push_back(tmp3[i]); 
pKernel->SetProperties(i, *double_variable, aa); 

Может кто-нибудь помочь мне взгляните на него?

+0

Типы важны в C++. Если вам нужно называть его разными типами, у вас есть два варианта: 1. передать переменную с типом, который получен из ожидаемого типа 2. Создайте новый метод, который преобразует пройденный тип в ожидаемый тип и вызовет метод orignal – MaxZoom

+1

Можете ли вы опубликовать сообщение об ошибке что вы видите? –

ответ

0

В своем обращении к SetProperties с использованием нескольких данных второй аргумент должен иметь тип Kratos::Variable<std::vector<double>>, чтобы он соответствовал третьему аргументу, который имеет тип std::vector<double>. Из кода, который вы показываете, похоже, что второй аргумент имеет тип Kratos:Variable<double>, который конфликтует с третьим аргументом.

+0

спасибо за ваш любезный ответ. Но исходный код в порядке, могут быть переданы как одиночные данные ('yyvsp [0] .double_value'), так и несколько данных (' * yyvsp [0] .vector_double_value'). –

Смежные вопросы