在模板化的特殊情况下将虚函数定义为纯 class
Define virtual function to be pure in special cases of templated class
我正在尝试定义一个模板化基础 class,它定义了一个将被用户覆盖的虚拟接口。在某些情况下,拥有此方法的默认实现是有意义的,但并非所有类型参数都如此。考虑一下:
template<typename T>
struct supplier
{
virtual std::unique_ptr<T> supply(std::istream& moreData) = 0;
};
鉴于 T
是默认可构造的 (std::is_default_constructible
),现在我想提供以下默认实现:
std::unique_ptr<T> supply(std::istream& moreData)
{
return std::unique_ptr<T>(new T);
}
问题不在于如何为适当的 T
定义此函数,而是如何使其显示为纯虚函数 - 从而强制用户实现 - 当它不是定义并且像一个普通的虚函数,如果它是。
我想我只是缺少一些明显的解决方案。我尝试专门化 struct supplier
但这意味着我必须将接口的其余部分定义两次,因此它绝对不是缩放解决方案。这也意味着我必须提供两次接口的其余部分。
对于具有许多虚拟功能的丰富基础 class 是否有负担得起的解决方案?
将需要专精的部分提取到单独的class模板中,然后从中继承。
namespace details {
template<class T, bool = std::is_default_constructible<T>::value>
struct supplier_base
{
virtual std::unique_ptr<T> supply(std::istream& moreData) = 0;
};
template<class T>
struct supplier_base<T, true>
{
virtual std::unique_ptr<T> supply(std::istream& moreData)
{
return std::unique_ptr<T>(new T);
}
};
}
template<class T>
struct supplier : details::supplier_base<T> { /* ... */ };
我正在尝试定义一个模板化基础 class,它定义了一个将被用户覆盖的虚拟接口。在某些情况下,拥有此方法的默认实现是有意义的,但并非所有类型参数都如此。考虑一下:
template<typename T>
struct supplier
{
virtual std::unique_ptr<T> supply(std::istream& moreData) = 0;
};
鉴于 T
是默认可构造的 (std::is_default_constructible
),现在我想提供以下默认实现:
std::unique_ptr<T> supply(std::istream& moreData)
{
return std::unique_ptr<T>(new T);
}
问题不在于如何为适当的 T
定义此函数,而是如何使其显示为纯虚函数 - 从而强制用户实现 - 当它不是定义并且像一个普通的虚函数,如果它是。
我想我只是缺少一些明显的解决方案。我尝试专门化 struct supplier
但这意味着我必须将接口的其余部分定义两次,因此它绝对不是缩放解决方案。这也意味着我必须提供两次接口的其余部分。
对于具有许多虚拟功能的丰富基础 class 是否有负担得起的解决方案?
将需要专精的部分提取到单独的class模板中,然后从中继承。
namespace details {
template<class T, bool = std::is_default_constructible<T>::value>
struct supplier_base
{
virtual std::unique_ptr<T> supply(std::istream& moreData) = 0;
};
template<class T>
struct supplier_base<T, true>
{
virtual std::unique_ptr<T> supply(std::istream& moreData)
{
return std::unique_ptr<T>(new T);
}
};
}
template<class T>
struct supplier : details::supplier_base<T> { /* ... */ };