微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您可以在 CRTP 方法中对派生类使用约束吗?

如何解决您可以在 CRTP 方法中对派生类使用约束吗?

像这样有效的 C++20 代码吗?

function wrap_wp_get_attachment_image_with_picture_tag( $html,$attachment_id,$size,$icon,$attr ){
    if ( is_admin() || $size == 'medium' || $size == 'thumbnail' ) return $html;
    if ( $mobile_id = get_post_meta( $attachment_id,'_Meta_key_of_mobile_picuture_id',true ) ){
        $mobile_srcset = wp_get_attachment_image_srcset( $mobile_id,'medium_large' );
        $html = '<picture><source media="( max-width : 782px )" srcset="'.$mobile_srcset.'">'.$html.'</picture>';
    }
    return $html;
}
add_filter( 'wp_get_attachment_image','wrap_wp_get_attachment_image_with_picture_tag',10,5 );

改编自 vector-of-bool 博文。

使用最新版本的 gcc,代码可以运行 fine,但最新版本的 clang 给出了这个 error

#include <iostream>

template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };

template <class Derived>
struct iterator_facade {
  Derived& operator--()
    requires impls_decrement<Derived>
  {
    auto& self = static_cast<Derived&>(*this);
    self.decrement();
    return self;
  }
};

struct my_iterator : iterator_facade<my_iterator> {
  void decrement() {
    std::cout << "decrement" << std::endl;
  }
};

int main() {
   my_iterator iter;
   --iter;
   return 0;
}

哪个编译器是正确的?

解决方法

正如 Barry 提到的,代码是有效的,这是 Clang bug 44833

与此同时,我可以通过编写这样的代码 (demo) 来解决这个问题:

#include <iostream>


template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };

template <class Derived>
struct iterator_facade {
  template <class T=Derived>
    requires impls_decrement<T>
  Derived& operator--()
  {
    auto& self = static_cast<Derived&>(*this);
    self.decrement();
    return self;
  }
};

struct my_iterator : iterator_facade<my_iterator> {
  void decrement() {
    std::cout << "decrement" << std::endl;
  }
};

int main() {
   my_iterator iter;
   --iter;
   return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。