我就需要有一个通用的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)甚至不会发出那我想投一个int
到unsigned long
含蓄警告,这绝对不是我想......
因此,在这种情况下, ,我将如何超载wrapper
类的运算符,以便在不需要时不需要创建临时对象wrapper
?如果我删除wrapper &operator+= (const unsigned long input)
超载,那么我将不得不使用这样的事情:
wrapper x(2);
x += wrapper(-2);
x += -2;//implicitly casts -2 to wrapper
,但我不认为我可以依靠的事实,编译器可能能够优化掉多余的对象..
我假设你正在用这两个函数调用'const long'参数化版本。即使正在进行也可能没有转换。 – 2012-12-19 18:50:59
@EsaLakaniemi我不知道我明白你的意思...... –
哦,现在我正确地阅读了这篇文章。编辑:哦,上帝,我只是应该停止回答问题我混在一起的答案和评论 – 2012-12-19 18:58:18