gpt4 book ai didi

c++ - 如何将 std::atomic::is_always_lock_free 用于 SFINAE?

转载 作者:太空狗 更新时间:2023-10-29 23:43:35 24 4
gpt4 key购买 nike

如何使用 std::atomic<T>::is_always_lock_free与 SFINAE?我有一个类模板 MyClass<T>我想在 2 个实现之间切换,这取决于是否 std::atomic<T>::is_always_lock_freetrue .这是我的:

template<typename T, typename Enable = void>
class MyClass {
// Fallback implementation
};

template<typename T>
class MyClass<T, typename std::enable_if<std::atomic<T>::is_always_lock_free>::type> {
// Optimized implementation using std::atomic
};

现在,当我尝试创建 MyClass<SomeCustomClass> 的实例时,我得到一个编译器错误:

_Atomic cannot be applied to type 'SomeCustomClass' which is not trivially copyable

它尝试使用模板特化,但没有使用回退实现,它根本不编译。有人可以解释一下这里出了什么问题吗?我怎样才能得到想要的结果?

最佳答案

您需要延迟检查std::atomic<T>::is_always_lock_free直到之后你知道 T是平凡可复制的。否则,atomic<T>格式错误。

为此,有 std::conjunction - 这是懒惰的/短路的:

template <typename T>
struct is_lock_free_impl
: std::integral_constant<bool, std::atomic<T>::is_always_lock_free> { };

template <typename T>
using is_lock_free = std::conjunction<
std::is_trivially_copyable<T>,
is_lock_free_impl<T>>;

现在,这个特性会提前终止并产生 false_type如果T不可简单复制。如果它 是可简单复制的,那么实例化 atomic<T> 是有效的,然后我们检查该特征。

关于c++ - 如何将 std::atomic<T>::is_always_lock_free 用于 SFINAE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com