C ++ 11:std :: mem_fn的类型名称

时间:2015-07-24 07:45:36

标签: c++ c++11

auto很好,但我需要在类中声明一个成员,而不是堆栈中的变量。

decltype有效,但不知何故看起来很奇怪

class Automation {
    void _init_state(int);

    decltype(std::mem_fn(&Automation::_init_state)) next_state;
};

std::function似乎也有效,但与纯成员函数

略有不同
class Automation {
    void _init_state(int) {}
public:
    decltype(std::mem_fn(&Automation::_init_state)) next_state;
    std::function<void(Automation&, int)> next_state_fn;

    Automation()
        : next_state(&Automation::_init_state)
        , next_state_fn(&Automation::_init_state)
    {}
};

int main()
{
    /* on ubuntu, x64 */
    std::cout << sizeof Automation::next_state << std::endl; /* 16 */
    std::cout << sizeof Automation::next_state_fn << std::endl; /* 32 */
    return 0;
}

有人可以告诉我这是什么方法吗?

1 个答案:

答案 0 :(得分:2)

标准未指定std::mem_fn的返回类型,因此没有可移植的方法来显式声明该类型的成员变量。

虽然decltype构造可能看起来很奇怪,但这是正确的方法。 std::function会产生一些开销,但更灵活,因为您可以比使用decltype版本更轻松地传递它。