我有一个模版类,如下所示:
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
或模板专门化,但是还没有提出一个优雅的解决方案。
答案 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;
};
对于仅原子类型,请将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;
// ...
};