我想有一个int
包装类行为像int
而不需要重载所有的运营商。同样的问题被问到,但没有真正回答here。我知道我可以编写一个模板包装器并重载数十个操作员来实现这个目标(实际上,我现在拥有这样的模板 - basically it looks like this mess)。然而,如果能够以某种方式暴露内部原语类型而不需要重载仅仅将呼叫转发给它的操作符,那将是很好的。int包装没有超载所有运营商
这可能吗?也许通过重载解引用操作符或某些?
编辑:实施例编号:
template<typename T>
class IDWrapper
{
public:
inline IDWrapper() { }
inline IDWrapper(T id) : m_Value(id) { }
constexpr static int size() { return sizeof(T); }
constexpr static T min() { return std::numeric_limits<T>::min(); }
constexpr static T max() { return std::numeric_limits<T>::max(); }
inline bool isValid() const { return m_Value != 0; }
inline operator T() const { return m_Value; }
inline operator T&() { return m_Value; } //this line was the attempt to make it transparent... unsuccessfully
inline IDWrapper &operator=(T v) { m_Value = v; return *this; }
inline void invalidate() { m_Value = 0; }
private:
T m_Value = 0;
};
基本上它包裹T
类型的ID在一个“特殊”的方式,使得它给出用于验证和无效它方便的选项。另外它可以方便地访问大小和最小/最大值。模板化包装器的原因是我需要稍后用base64号码或其他非标准号码类型替换它,并且我需要依赖于IDWrapper的接口保持一致。数字运算符仍将由T
提供,所以当我将它们拼出来时,我只是转发这个电话,因此是问题。
重载转换运算符? – StoryTeller
好问题,但如果您只是将示例代码的相关部分插入到您的帖子中,会更容易。 – ryyker
这是一个点运算符重载的粗略用例,但至少在C++ 17之后的方言中不会出现在C++中。鉴于这是一个简单的'int'包装,可能'BOOST_STRONG_TYPEDEF'可以提供帮助,但最后我记得,它的作者有一些设计问题。 – chris