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;
}
有人可以告诉我这是什么方法吗?
答案 0 :(得分:2)
标准未指定std::mem_fn
的返回类型,因此没有可移植的方法来显式声明该类型的成员变量。
虽然decltype
构造可能看起来很奇怪,但这是正确的方法。 std::function
会产生一些开销,但更灵活,因为您可以比使用decltype
版本更轻松地传递它。