2012-12-19 70 views
3

我就需要有一个通用的C++包装的大数字图书馆,并在图书馆提供像这样C风格的功能项目的工作:避免隐式转换

//assignment 
lib_set(lib_type data, lib_type input); 
lib_set_si(lib_type data, long input); 
lib_set_ui(lib_type data, unsigned long input); 

//addition 
lib_add(lib_type data, lib_type input); 
lib_add_ui(lib_type data, unsigned long input); 

为了避免创建临时当它是不是真的有必要物品,我结束了这样的事情:

class wrapper 
{ 
private: 
    lib_type data; 
public: 

    wrapper() 
    { 
     lib_set_ui(this->data, 0UL); 
    } 

    wrapper (const wrapper &input) 
    { 
     lib_set(this->data, input.data); 
    } 

    wrapper (const long input) 
    { 
     lib_set_si(this->data, input); 
    } 

    wrapper (const unsigned long input) 
    { 
     lib_set_ui(this->data, input); 
    } 

    wrapper &operator+= (const wrapper &input) 
    { 
     lib_add(this->data, input.data); 
     return *this; 
    } 

    wrapper &operator+= (const unsigned long input) 
    { 
     lib_add_ui(this->data, input); 
     return *this; 
    } 
}; 

不幸的是,如果我这样做:

wrapper x(2); 
x += -2; 

编译器(GCC/VS2010)甚至不会发出那我想投一个intunsigned long含蓄警告,这绝对不是我想......

因此,在这种情况下, ,我将如何超载wrapper类的运算符,以便在不需要时不需要创建临时对象wrapper?如果我删除wrapper &operator+= (const unsigned long input)超载,那么我将不得不使用这样的事情:

wrapper x(2); 
x += wrapper(-2); 
x += -2;//implicitly casts -2 to wrapper 

,但我不认为我可以依靠的事实,编译器可能能够优化掉多余的对象..

+0

我假设你正在用这两个函数调用'const long'参数化版本。即使正在进行也可能没有转换。 – 2012-12-19 18:50:59

+0

@EsaLakaniemi我不知道我明白你的意思...... –

+0

哦,现在我正确地阅读了这篇文章。编辑:哦,上帝​​,我只是应该停止回答问题我混在一起的答案和评论 – 2012-12-19 18:58:18

回答

3

我不知道如何描述隐藏转换的方法。但是,您至少可以让编译器对其发出警告。

如果您在编译时使用gnu Mingw/gcc,只需传递-Wconversion-Wsign-conversion。您现在应该在上面的代码中收到警告。

对于MSVC,/Wall/W4应该会得到同样的结果。

+0

用于'-Wsign-conversion'的+1。我几乎可以确定它是由'-Wall'或'-Wextra'启用的。你知道除了'-Wall -Wextra -Wconversion -Wsign-conversion'之外,我还应该向编译器发送其他如此可爱的警告开关吗?有没有什么办法可以在Visual Studio中实现同样的功能? –

+1

@MihaiTodor:默认情况下,Visual Studio会对符号转换发出警告。如果没有,进入项目设置,并在那里的某个地方,您可以将警告级别设置为更高的级别。 (3默认我认为) –

+0

@MooingDuck看来我必须去'/ W4',但是谢谢你指出这个!它确实有帮助。 –