我在超类中有函数,用于将字符串与内部函数相关联:
class Base
{
typedef std::function<void(double)> double_v;
bool registerInput(std::string const& key, double_v const& input) {
functions[key] = input;
}
void setInput(std::string key, double value) {
auto fit = functions.find(key);
if (fit == functions.end()) return;
fit->second(value);
}
std::map<std::string, double_v> functions;
}
我的想法是,我可以注册函数的任何子类都可以使用字符串和值来调用它们:
SubBase::SubBase() : Base(){
Base::registerInput(
"Height",
static_cast<void (*)(double)>(&SubBase::setHeight)
);
}
void SubBase::setHeight(double h) {
....
}
然后可以通过以下方式调用:
subBaseInstance.setInput("Height", 2.0);
然而,当我编译时,我收到以下错误:
In constructor ‘SubBase::SubBase()’
error: invalid static_cast from type ‘<unresolved overloaded function type>’ to type ‘void (*)(double)’
我错过了什么?
答案 0 :(得分:4)
正如其他人所说,类型不匹配。但是,您可以使用std::bind
来运行它:
Base::registerInput(
"Height",
std::bind(&SubBase::setHeight, *this, std::placeholders::_1)
);
答案 1 :(得分:1)
typedef std::function<void(double)> double_v;
这是function-pointer
。
static_cast<void (*)(double)>(&SubBase::setHeight)
这是member-function pointer
。他们不能相互转换。
您可以将std::bind
用于此
SubBase::SubBase() : Base(){
Base::registerInput(
"Height",
std::bind(&SubBase::setHeight, this, std::placeholders::_1)
);
答案 2 :(得分:1)
SubBase
不是static
,因此它有一个隐含的第一个参数SubBase*
(你称之为成员函数的对象)。因此签名是void (*) (SubBase*, double)
。在C ++ 11中,您可能(我不完全确定)将其转换为function<void (SubBase*, double)>
。
使用lambda函数,您可以执行以下操作:
SubBase::SubBase() : Base(){
auto myself = this;
Base::registerInput(
"Height",
[myself] (double v) { myself->setHeight (v); }
);
}
void SubBase::setHeight(double h) {
....
}