В основном я просто хочу выполнить произвольную операцию, используя заданные аргументы произвольных типов.
Базовым классом типа аргумента является Var, а Operation - базовым классом операции, которая будет выполняться для заданных аргументов.
У меня есть класс Evaluator, который содержит набор операторов, отображаемых с помощью opId. Оценщик выполнит операцию на основе аргумента opId, указанного в функции-члене eval (), затем функция Assessment () выполнит поиск поддерживаемого оператора, который будет принимать тип аргумента и opId.
я хочу спросить, есть ли какой-нибудь эффективный шаблон или алгоритм, который будет делать это без dynamic_cast ‹> и / или цикла по сбору операторов.
`
class Var {
public:
bool isValidVar();
static Var invalidVar();
}
template<typename T> class VarT : public Var {
public:
virtual const T getValue() const;
}
class Operator {
public:
virtual Var evaluate(const Var& a, const Var& b) = 0;
}
template<typename T> class AddOperator : public Operator {
public:
virtual Var evaluate(const Var& a, const Var& b)
{ //dynamic_cast is slow!
const VarT<T>* varA = dynamic_cast<const VarT<T>*>(&a);
const VarT<T>* varB = dynamic_cast<const VarT<T>*>(&b);
if(varA && varB) //operation supported
{
return VarT<T>(varA->getValue() + varA->getValue());
}
return Var::invalidVar(); //operation for this type is not supported
}
}
class Evaluator {
private:
std::map<int,std::vector<Operator>> operatorMap;
public:
virtual Var evaluate(const Var& a, const Var& b,int opId)
{
std::map<int,std::vector<Operator>>::iterator it = this->operatorMap.find(opId);
if(it != this->operatorMap.end())
{
for(size_t i=0 ; i<it->second.size() ; i++)
{
Var result = it->second.at(i).evaluate(a,b);
if(result.isValidVar())
{
return result;
}
}
}
//no operator mapped, or no operator support the type
return Var::invalidVar();
}
}
`