я следующий класс, объявленным в моем файле .h:Как правильно сочетать псевдонимы типов, указатели на функции и шаблонные функции
class BeliefCondFunc
{
private:
using funcTypeBool = bool(*)(const bool&, const std::list<bool>&, const std::vector<bool>&);
using funcTypeInt = bool(*)(const int&, const std::list<int>&, const std::vector<int>&);
using funcTypeFloat = bool(*)(const float&, const std::list<float>&, const std::vector<float>&);
using funcTypeString = bool(*)(const std::string&, const std::list<std::string>&, const std::vector<std::string>&);
static std::unordered_map<std::string, funcTypeBool> const m_FunctionMapBool;
static std::unordered_map<std::string, funcTypeInt> const m_FunctionMapInt;
static std::unordered_map<std::string, funcTypeFloat> const m_FunctionMapFloat;
static std::unordered_map<std::string, funcTypeString> const m_FunctionMapString;
template <typename T>
static bool Greater(const T& Fact, const std::list<T>& Facts, const std::vector<T>& Params)
{
return Params.empty() ? false : (Fact > Params[0]);
}
public:
template <typename T>
static bool Call(const std::string FuncName, const T& Fact, const std::list<T>& Facts, const std::vector<T>& Params)
{
if(typeid(T) == typeid(int))
return m_FunctionMapInt.find(FuncName) != m_FunctionMapInt.end() ? (*m_FunctionMapInt.at(FuncName))(Fact, Facts, Params) : false;
return false;
}
};
И в файле .cpp I определяют const
функции отображения следующим образом:
std::unordered_map<std::string, BeliefCondFunc::funcTypeInt> const BeliefCondFunc::m_FunctionMapInt
{
{ "Greater", &Greater<int> },
};
Однако, когда я пытаюсь скомпилировать этот код, я получаю следующую ошибку относительно вызова указателя функции в методе Call()
:
error C2664: 'bool (const int &,const std::list<int,std::allocator<_Ty>> &,const std::vector<_Ty,std::allocator<_Ty>> &)': cannot convert argument 3 from 'const std::vector<std::string,std::allocator<_Ty>>' to 'const std::vector<int,std::allocator<_Ty>> &'*
Любые идеи, что я делаю неправильно здесь?
'& BeliefCondFunc :: Greater' –
@RichardHodges Нет, это ничего не меняет. – Matthias
@AlexD Почему нет, и какой другой подход вы бы рекомендовали вместо этого? – Matthias