一个类成员的std :: mem_fn不会编译

时间:2015-07-15 05:49:31

标签: c++ qt c++11

我正在尝试使用函数指针在我的类中使用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的语法,但显然有错误。

1 个答案:

答案 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_funstd::mem_fun_ref以及它们的使用方式。