2009-08-26 24 views
7

Tôi đang cố gắng tạo các đối tượng mới và thêm chúng vào một danh sách các đối tượng sử dụng boost :: bind. Ví dụ.Sử dụng boost :: bind với một hàm tạo

struct Stuff {int some_member;}; 
struct Object{ 
    Object(int n); 
}; 
.... 
list<Stuff> a; 
list<Object> objs; 
.... 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(Object, 
    boost::bind(&Stuff::some_member,_1) 
) 
); 

Điều này dường như không hoạt động. Có cách nào để sử dụng một constructor với boost :: bind, hoặc tôi nên thử một số phương pháp khác?

+0

Ý của bạn là "có vẻ hoạt động"? nó không được biên soạn hoặc danh sách không được phổ biến? – Dewfy

+1

Mã Som thực sự biên dịch sẽ giúp ích. "A" là gì - nó xuất hiện để có bộ sưu tập bắt đầu và kết thúc phương pháp mà còn some_member? –

+0

jon, đó là lỗi của tôi. Bây giờ nó đã được sửa. Dewfy, mã không biên dịch. –

Trả lời

5

Nếu Stuff::some_memberintObject có một ctor không rõ ràng dùng một int, điều này sẽ làm việc:

list<Stuff> a; 
list<Object> objs; 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(&Stuff::some_member,_1) 
); 

Nếu không, bạn có thể sử dụng boost::lambda::constructor

+0

Tôi đơn giản hóa mã của mình một chút quá nhiều. Hàm khởi tạo trong mã thực của tôi đã lấy ba đối số, vì vậy trong lừa đảo chuyển đổi ngầm không hoạt động. Tuy nhiên, liên kết đã trả lời câu hỏi của tôi. Cảm ơn. –

0

Nó phụ thuộc vào những gì a::some_member đang quay trở lại - nếu đó là Object thì bạn không cần phải bọc kết quả trong một đường hầm Object - nó sẽ được xây dựng. Nếu thói quen không trả về Object thì bạn có thể sẽ phải xoa bóp kết quả một chút, mà bạn có thể kéo bằng boost::bind nhưng chức năng tiện ích có thể giữ cho mã dễ đọc hơn.

Trong cả hai trường hợp, nhiều mã sẽ hữu ích hơn, cụ thể là loại cá thể của aObject.

+0

Tôi đã thay đổi mã một chút. Cho phép nói rằng tôi có một Object (int) constructor và Stuff :: some_member là một int. Về cơ bản câu hỏi của tôi là, có thể bất cứ điều gì của hình thức tăng :: ràng buộc (Object, ...) bao giờ làm việc, hoặc là nhà thầu chỉ không được phép như là một đối số để ràng buộc? –

3

liên kết Éric của nói, một phần "Đó là không thể lấy địa chỉ của một hàm tạo, do đó các hàm tạo không thể được sử dụng như các hàm đích trong các biểu thức ràng buộc. " Vì vậy, những gì tôi đã cố gắng làm là không thể.

tôi xung quanh nó bằng cách tạo ra một chức năng:

Object Object_factory(int n) 
{ return Object(n); } 

và sử dụng Object_factory nơi tôi đang cố gắng sử dụng các nhà xây dựng Object.

11

Nếu bạn đang sử dụng tăng 1.43, bạn có thể sử dụng boost :: factory và boost :: value_factory, cho phép bạn gói gọn một lời gọi hàm tạo. Như sau:

transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(boost::value_factory<Object>(), 
    boost::bind(&Stuff::some_member,_1) 
) 
); 
Các vấn đề liên quan