一个功能的类模板专业化

sam*_*lnj 1 c++ sfinae c++17

我有一个看起来像这样的模板化类:

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模板专门化或模板专门化,但还没有提出一个优雅的解决方案。

Pio*_*cki 5

#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)