2016-06-28 62 views
0

我想有一个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提供,所以当我将它们拼出来时,我只是转发这个电话,因此是问题。

+0

重载转换运算符? – StoryTeller

+0

好问题,但如果您只是将示例代码的相关部分插入到您的帖子中,会更容易。 – ryyker

+1

这是一个点运算符重载的粗略用例,但至少在C++ 17之后的方言中不会出现在C++中。鉴于这是一个简单的'int'包装,可能'BOOST_STRONG_TYPEDEF'可以提供帮助,但最后我记得,它的作者有一些设计问题。 – chris

回答

0

所以我拨弄着它所作的评论到OP启发,似乎有两种(或仅此两项)重载运营商可以做的伎俩:

operator T&() { /*...*/ } 
operator const T&() const { /*...*/ } 

当然也不是没有的成本。例如,如果Tint(或其中任何类型的sizeof(T) < sizeof(void*)),那么返回const引用比进行副本(但让副本运算符打破透明度)更为昂贵。更不用说存储地址查询了。我不确定潜在的其他问题,请随时发表评论/回答。但是,这工作。

+0

定义“works”。你想要什么支持?你的测试用例是什么? –

+0

@KarolyHorvath我想支持T的包装类,它不会重载所有的操作符(只会将它们转发给T),但这些操作符的执行是直接在包装类型上完成的。解释是在OP中,但基本上我想有一些自定义/方便的方法添加在T的顶部,否则表现为 - 正在T。而且既然你不能从原始类型继承包装是答案。 – Resurrection

+1

示例:添加两个IDWrappers的结果是什么? –