2012-11-02 28 views
6

Tôi đang di chuyển dự án của mình sang C++ 11 và tôi đang cố gắng sử dụng càng nhiều thư viện chuẩn càng tốt.Một 'typedef' cho một chức năng mẫu (boost :: make_shared)

Trước khi tôi hoàn thành việc di chuyển, tôi cần một cách nhanh chóng để lật giữa tăng cường và STL thực hiện shared_ptr (để làm điểm chuẩn, kiểm tra đơn vị, v.v ...).

Vì vậy, tôi xác định một bí danh cho shared_ptr như thế này:

#ifdef _USE_BOOST_ 
template <class C> 
using shared_ptr = boost::shared_ptr<C> 
#else 
template <class C> 
using shared_ptr = std::shared_ptr<C> 
#endif 

bây giờ tôi cần phải làm tương tự cho make_shared ... Nhưng làm thế nào? Macro? Một wrapper? Tôi không thực sự thích một trong số họ. Các lựa chọn thay thế là gì?

+1

Bạn không có nhiều sự lựa chọn nhưng để viết một wrapper nhanh chóng. – Puppy

Trả lời

7

Sử dụng mẫu variadic và chuyển tiếp hoàn hảo:

template<typename C, typename...Args> 
shared_ptr<C> make_shared(Args &&...args) { 
#ifdef _USE_BOOST_ 
    return boost::make_shared<C>(std::forward<Args>(args)...); 
#else 
    return std::make_shared<C>(std::forward<Args>(args)...); 
#endif 
} 
+0

Chính xác là câu trả lời tôi viết, nhưng bạn đánh tôi với nó. – bstamour

+0

Đây là những gì tôi đã làm, nhưng tôi không thích thực tế là kết quả 'shared_ptr' được sao chép hai lần. –

+2

Tôi chắc chắn rằng bản sao sẽ tối ưu hóa ra –

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