bas*_*eln 2 c++ stdatomic c++17
我如何使用std::atomic<T>::is_always_lock_freeSFINAE?我有一个类模板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
};
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试创建一个实例时MyClass<SomeCustomClass>,我得到一个编译器错误:
_Atomic不能应用于类型'SomeCustomClass',它不是可轻易复制的
它尝试使用模板特化,但不使用回退实现,它根本不编译.有人可以解释这里有什么问题吗?我如何获得理想的结果?
你需要推迟检查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>>;
Run Code Online (Sandbox Code Playgroud)
现在,这个特征将提前中止,并且false_type如果T不是可轻易复制则会产生.如果它是可以轻易复制的,那么实例化是有效的atomic<T>,那么我们检查这个特性.