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;
};
对于纯原子类型,将 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;
我有一个模板化的 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;
};
对于纯原子类型,将 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;