boost :: recursive_wrapper和std :: unique_ptr

时间:2016-02-02 08:55:07

标签: c++ c++11 boost smart-pointers boost-variant

目前(自 C ++ 11 )使用function addToWishList(product_id) { $.ajax({ url: 'index.php?route=account/wishlist/add', type: 'post', data: 'product_id=' + product_id, dataType: 'json', success: function(json) { $('.success, .warning, .attention, .information').remove(); if (json['success']) { $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>'); $('.success').fadeIn('slow'); $('#wishlist-total').html(json['total']); $('html, body').animate({ scrollTop: 0 }, 'slow'); url = $('base').attr('href') + 'index.php?route=account/wishlist'; // Add this line location = url; // Add this line } } }); } 设计boost::recursive_wrapper很简单:

std::unique_ptr

但目前它是通过运营商template< typename T > class recursive_wrapper { std::unique_ptr< T > storage; public : template< typename ...Args > recursive_wrapper(Args &&... args) : storage(std::make_unique< T >(std::forward< Args >(args)...)) { ; } template< typename R > operator R & () noexcept { return static_cast< R & >(*storage); } template< typename R > operator R const & () const noexcept { return static_cast< R const & >(*storage); } void swap(recursive_wrapper & other) noexcept { storage.swap(other.storage); } }; ::new设计的。在现代C ++中使用原始boost::checked_deletenew运算符被认为是一种不好的做法。

如果target只是 C ++ 11 更新,那么使用delete实现recursive_wrapper是否有任何缺点(我的意思是编译时性能)和运行时性能下降,例如或其他东西)?如果作为要求的向后兼容性不复存在怎么办?

1 个答案:

答案 0 :(得分:1)

我想你会发现不这样做的原因与性能无关。

boost::recursive_wrapper专门设计为允许boost::variant包含自己。我很确定如果你检查boost::variant的实现,你会发现递归模板的模板扩展依赖于看起来像这样的特化:

template<class...T> 
struct SomeClass<boost::recursive_wrapper<boost::variant<T...>>> 
{
    ....

除非您计划重新实现boost::variant以使用不同的包装类,否则会使它们不兼容。