Class 一个函数的模板专业化

Class Template Specialization for one Function

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

template<typename T>
class TemplatedClass
{
    // ... Other functions
    void AssignTo(const T & value)
    {
        m_value = value;
    }

private:
    T m_value;
    // ...
}

我想与 std::atomic<> 一起工作,但目前没有,因为 std::atomic<> 是不可复制的。

有什么方法可以只重新实现 AssignTo() 函数,但不加修改地继续使用所有其他函数,这样我们就可以拥有例如TemplatedClass<std::atomic<bool>?我考虑过使用 std::enable_if 或模板专业化,但还没有想出一个优雅的解决方案。

Is there any way to only re-implement the AssignTo() function, but keep using all the other functions without modification so that we can have e.g. TemplatedClass<std::atomic<bool>?

你的意思如下?

template <typename>
struct isAtomic : public std::false_type
 { };

template <typename T>
struct isAtomic<std::atomic<T>> : public std::true_type
 { };

template <typename T>
constexpr auto isAtomic_v = isAtomic<T>::value;

template <typename T>
class TemplatedClass
 {
    public: 
       // ... Other functions

       template <typename U = T>
       std::enable_if_t<false == isAtomic_v<U>> AssignTo(const T & value)
        { m_value = value; }

       template <typename U = T>
       std::enable_if_t<true == isAtomic_v<U>> AssignTo(const T & value)
        { /* ??? */ }

    private:
       T m_value;
    // ...
  };
#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;
};

DEMO


对于纯原子类型,将 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;