我正在尝试使用函数指针在我的类中使用C ++ 11和MSVC2013来拥有成员函数。
class MyClass
{
public:
// ...
QColor Colorize(double dValue) const;
private:
bool m_bUseColor1;
QColor Color1(double dValue) const;
QColor Color2(double dValue) const;
};
实施
QColor MyClass::Colorize(double dValue) const
{
auto colorize_func = m_bUseColor1 ? std::mem_fn(&MyClass::Color1) : std::mem_fn(&MyClass::Color2);
QColor myColor = colorize_func(23.3);// FAILS TO COMPILE
}
这会出现以下错误:
错误102错误C2100:非法间接C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ xrefwrap 311 错误103错误C2296:'。*' :非法,左操作数有类型' double' C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ xrefwrap 311
任何想法在这里出了什么问题?我遵循cppreference mem_fn
的语法,但显然有错误。
答案 0 :(得分:3)
使用colorize_func(23.3)
需要编译和运行类MyClass
的实例。不只是函数的参数。
E.g:
MyClass mc;
// ....
colorize_func(mc, 23.3);
由于colorize_func
的使用已经在成员函数中,因此您也可以使用this
。
QColor myColor = colorize_func(this, 23.3);
应该这样做。
无论如何,代码都是成员的一部分,也可以简化代码;
QColor MyClass::Colorize(double dValue) const
{
return (m_bUseColor ? Color1(dValue) : Color2(dValue));
}
有关std::mem_fn
及其使用的说明(来自cppreference.com的报价);
函数模板
std::mem_fn
为成员指针生成包装器对象,可以存储,复制和调用指向成员的指针。调用std::mem_fn
时,可以使用对象的引用和指针(包括智能指针)。
在所有情况下,提供给可调用包装器的第一个(或唯一的)参数是指向该类实例的指针或引用。
first_argument_type
T*
如果pm
是指向一个参数的成员函数的指针
这些要求类似于较旧的std::mem_fun
和std::mem_fun_ref
以及它们的使用方式。