2010-07-23 29 views
7
#include <iostream> 
#include <string> 

#include <boost/bind.hpp> 

void foo(std::string const& dummy) 
{ 
    std::cout << "Yo: " << dummy << std::endl; 
} 

int main() 
{ 
    int* test; 
    std::string bar("platypus"); 
    (boost::bind(&foo, bar))(test, test, test, test, test, test, test, test); 
} 

Khi chạy, nó in ra, "Yo: thú mỏ vịt". Dường như hoàn toàn bỏ qua các tham số bổ sung. Tôi mong đợi để có được một lỗi biên dịch. Tôi vô tình giới thiệu một lỗi vào mã của tôi theo cách này.Tại sao chức năng Boost.Bind có thể được gọi với các tham số phụ?

Trả lời

2

Tôi không biết tại sao điều này được phép, nhưng tôi biết đó là hành vi mong đợi. Từ here:

ràng buộc có thể xử lý các chức năng với hơn hơn hai đối số, và cơ chế thay thế lý lẽ của nó là hơn chung:

bind(f, _2, _1)(x, y);     // f(y, x) 
bind(g, _1, 9, _1)(x);     // g(x, 9, x) 
bind(g, _3, _3, _3)(x, y, z);   // g(z, z, z) 
bind(g, _1, _1, _1)(x, y, z);   // g(x, x, x) 

Lưu ý rằng, trong ví dụ cuối cùng, đối tượng chức năng được tạo bởi liên kết (g, _1, _1, _1) không chứa tham chiếu đến bất kỳ đối số nào vượt quá trước, nhưng vẫn có thể được sử dụng với nhiều đối số. Bất kỳ đối số nào khác được bỏ qua âm thầm (nhấn mạnh mỏ), chỉ như đối số đầu tiên và thứ hai được bỏ qua trong ví dụ thứ ba.

+0

Tôi vẫn muốn biết lý do tại sao để cho phép hành vi này nếu có ai đó phát hiện ra :) –

+0

@Joseph: Rất có thể quá phức tạp để không cho phép nó một cách rõ ràng. –

0

Tôi đặt cược nó tạo ra hàm bị ràng buộc dưới dạng hàm variadic, như printf.

+1

Không. Số lượng đối số có một giới hạn cố định được xác định là [http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html#NumberOfArguments). Giới hạn hiện tại là chín. –

Các vấn đề liên quan