- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何使用 std::atomic<T>::is_always_lock_free
与 SFINAE?我有一个类模板 MyClass<T>
我想在 2 个实现之间切换,这取决于是否 std::atomic<T>::is_always_lock_free
是true
.这是我的:
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/
我有以下代码: #include int main () { std::atomic value(0); value.fetch_add(1, std::memory_order::
如何使用 std::atomic::is_always_lock_free与 SFINAE?我有一个类模板 MyClass我想在 2 个实现之间切换,这取决于是否 std::atomic::is_al
在没有操作系统的嵌入式 (ARM) 环境中,如果我使用中断,那么使用 std::atomic 是否存在死锁的可能性? ?如果是这样,如何? 一般来说,任何时刻,控制都可以被中断来处理中断。特别是,如果
我是一名优秀的程序员,十分优秀!