一个功能的类模板专业化

时间:2019-08-29 19:54:09

标签: c++ c++17 sfinae

我有一个模版类,如下所示:

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

2 个答案:

答案 0 :(得分: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;
};

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;

答案 1 :(得分:0)

  

有什么方法只能重新实现AssignTo()函数,但是可以不修改地继续使用所有其他函数,这样我们就可以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;
    // ...
  };