我有一个看起来像这样的模板化类:
template<typename T>
class TemplatedClass
{
// ... Other functions
void AssignTo(const T & value)
{
m_value = value;
}
private:
T m_value;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想使用std::atomic<>,但目前不可以,因为它std::atomic<>是不可复制的。
有什么方法可以只重新实现该AssignTo()功能,而可以不修改地继续使用所有其他功能,以便我们拥有例如TemplatedClass<std::atomic<bool>?我曾考虑过使用std::enable_if模板专门化或模板专门化,但还没有提出一个优雅的解决方案。
#include <type_traits>
template <typename T>
class TemplatedClass
{
public:
void AssignTo(const T& value)
{
if constexpr (std::is_copy_assignable_v<T>) {
m_value = value;
} else {
// Something else
}
}
private:
T m_value;
};
Run Code Online (Sandbox Code Playgroud)
对于仅原子类型,请替换std::is_copy_assignable_v<T>为!is_atomic_v<T>:
template <typename>
constexpr bool is_atomic_v = false;
template <typename T>
constexpr bool is_atomic_v<std::atomic<T>> = true;
Run Code Online (Sandbox Code Playgroud)