解释一下:
struct X
{
void foo(int arg) { cout << "X" << arg << endl; }
};
struct Y
{
void bar(int arg) { cout << "Y" << arg << endl; }
};
int main(int argc, char *argv[])
{
X x;
Y y;
mem_fun1_t<void, X, int> f1 = std::mem_fun(&X::foo);
boost::function<void (int)> f11 = std::bind1st(f1, &x);
f11(2);
mem_fun1_t<void, Y, int> f2 = std::mem_fun(&Y::bar);
boost::function<void (int)> f22 = std::bind1st(f2, &y);
f22(2);
f11 = f22; // WOW, THIS IS ALLOWABLE
}
Boost 如何在幕后工作以允许 f11 = f22 行?
似乎不寻常,因为 f11 是一个函子,它的 operator(int) 用 x 的 this 调用 X::foo(int),所以它似乎是特定于 X 的类型,然后当我对 f2/f22 执行相同操作时,它的特定到 Y,那么如何允许 f11 = f22 行?
我实际上想做 f11 = f22 行,但我很惊讶地看到这是允许的,并且我试图理解这不是类型不匹配的原因。
我知道,“使用来源,卢克”,但是 Boost 来源很难理解/理解那里发生的一切。
如果您可以为您的答案显示由模板化扩展的类,那将有所帮助。
我以为它可以通过 void* 铸造或类似的东西来解决这个问题,但这似乎是一种黑客行为,并且在 Boost 下会弯腰到那个水平。那么胡说八道?
顺便说一句,如果你以前没有遇到过这种事情,你至少应该对这个神奇的东西感到惊讶,因为你不能在上面说“x = y”,因为这显然是不允许的,因为它们是不同的类型并且没有 X::operator=(Y&),所以这就是这种惊奇的来源——它是一个巧妙的诡计。