2012-04-04 44 views
9

Khi không có mẫu variadic (vẫn còn!) Trong Visual Studio 2010/2011, một hàm tạo cần nhiều tham số có thể có vấn đề. Ví dụ: nội dung sau sẽ không biên dịch:std :: make_shared số tham số trong hàm tạo

MyMaterials.push_back(std::make_shared<Material>(MyFacade, 
                name, 
                ambient, 
                diffuse, 
                specular, 
                emissive, 
                opacity, 
                shininess, 
                shininessStrength, 
                reflectivity, 
                bumpScaling, 
                maps, 
                mapFlags)); 

, vì nó có 13 tham số và tôi nghĩ make_shared bị giới hạn từ arg0 đến arg9. Công việc rõ ràng xung quanh là hai phần xây dựng, nhưng tôi đã hy vọng để tránh điều này. Có khả năng nào khác ở đây, ngoài việc sử dụng mới thay vì make_shared?

Cảm ơn.

Trả lời

20

Bạn có thể sử dụng xây dựng một lớp mà sau đó sẽ được di chuyển vào giá trị phân bổ heap.

MyMaterials.push_back(std::make_shared<Material>(
    Material(MyFacade, name, ambient, diffuse, specular, 
      emissive, opacity, shininess, shininessStrength, 
      reflectivity, bumpScaling, maps, mapFlags))); 
+0

Ah. Tất nhiên. Điều đó có ý nghĩa hoàn hảo. – Robinson

+0

Điều tốt là make_shared cũng sẽ sử dụng thói quen phân bổ một tối ưu khi tạo shared_ptr –

+0

Xin lỗi - Tôi không thấy cách này tránh sao chép từ ngăn xếp cục bộ (nơi Material() đang được xây dựng) tới heap (nơi make_shared sẽ thực sự đặt nó). Trong trường hợp này, làm sao có thể tránh được bản sao? – Mordachai

1

bạn có thể tạo "cấu trúc đầu vào" với tất cả các thành viên có liên quan.
điền vào bằng các giá trị chính xác và gọi hàm tạo với điều đó làm thông số duy nhất của mình.

+0

Cũng là một ý tưởng hay, nhưng tôi muốn tránh các cấu trúc "ngẫu nhiên" không liên quan cho những thứ như thế này :-). – Robinson

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