我希望有一个int
包装类,其行为类似于int
,而不需要重载所有运算符。问了同样的问题,但没有真正回答here。我知道我可以编写一个模板包装器并重载数十个运算符来实现它(事实上,我现在就像那样 - basically it looks like this mess)。然而,如果有可能以某种方式暴露内部基元类型而不需要重载只是将调用转发给它的运算符,这将是很好的。
这可能吗?也许是通过重载解除引用操作符或某些东西?
编辑:示例代码:
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包装在&#34;特殊&#34;方式,以便它提供验证和使其无效的方便选项。此外,它还可以方便地访问尺寸和最小/最大。模板化包装器的原因是我需要稍后用base64编号或其他非标准数字类型替换它,我需要依赖IDWrapper的接口保持一致。数值运算符仍将由T
提供,因此当我拼出它们时,我只是转发呼叫,因此问题。
答案 0 :(得分:1)
所以我在OP的评论的启发下摆弄了它,似乎让这两个(只有这两个)重载的运算符可以解决这个问题:
operator T&() { /*...*/ }
operator const T&() const { /*...*/ }
当然,并非没有成本。例如,如果T
是int
(或sizeof(T) < sizeof(void*)
的任何类型),则返回const引用比执行副本更昂贵(但是复制运算符会破坏透明度) 。更不用说内存地址查找。我不确定这个潜在的其他问题,所以随时评论/回答。但这很有效。