【发布时间】:2018-01-22 20:47:22
【问题描述】:
有没有办法将类型封装在模板类中(类似于 std::optional 之类的东西),它具有所有必要的特殊构造函数和赋值运算符(即复制 ctor/assignment、移动 ctor/assignment)但仅“启用“如果基础类型具有这些功能,它们会怎样? type_traits 中的函数如 std::is_copy_constructible 看起来可能会有所帮助,但我不确定如何使用它们来实现这一目标。作为参考,我尝试实现的类型类似于std::optional,但我想使用自定义错误类型而不是简单的“无”替代值。例如
template <typename T>
class ErrorOr {
public:
enum class Error {
FATAL,
WARNING,
NONE,
};
ErrorOr(T val) : val(val), error(Error::NONE) {}
ErrorOr(Error error) : error(error) {}
// TODO: Implement copy/move ctors/assignment operators that only
// exist if they do for the underlying T
T get() { val; }
private:
T val;
Error error;
};
这是一个非常简单/最小的实现,没有很多必要的功能,但希望能说明我想要表达的观点。
这在 C++11 中可行吗?
【问题讨论】:
-
是的,可选的就是这样工作的。
-
您在
get成员函数中缺少return。另请注意,ErrorOr已经假定 T 是可复制的,因为它在其ErrorOr(T val)构造函数中复制了一个 T 值。 -
简单的方法是实现它们(即使
T不支持它)。当使用不受支持的方法时(并且仅在使用它时),您会收到编译错误。 SFINAE/static_assert 可能有更好的错误信息。 SFINAE 将允许在 SFINAE 上下文中使用它们(但在最坏的情况下,用户可以使用T来实现)。 -
有了这个sn-p,隐式声明的特殊成员就会做正确的事。你到底想做什么?
标签: c++ c++11 templates typetraits