可选参数常量引用重新分配
Optional parameter const reference reassignment
我知道这是不可能的,因为我正在打破常量收缩的心脏,我不允许以任何方式修改对象,但是我如何选择传递参数作为引用?
假设我有一个错误代码结构和一些成员函数,我可以选择检查的错误代码
struct my_error_code {
int val;
std::string message;
};
struct my_complicated_obj {
/* Compiles fine, understandbly, ec is not optional*/
void do_stuff(/*params,*/my_error_code& ec){
ec = {0x10, "Something went wrong"};
return;
}
void do_stuff_optionally(/*params,*/ const my_error_code& ec= {}){
/* There is no overload of assignment or constructos I can trick into allowing this.. */
ec = {0x20, "Something is wrong."};
return;
}
};
在上面的do_stuff_optionally
显然不会编译。我当时所知道的解决方案是
my_error_code& my_error_code_default(){
static my_error_code ec = {0, "No Error"};
return ec;
}
void do_stuff_optionally_not_so_very_clean(/*params,*/ my_error_code& ec = my_error_code_default()){
ec = {0x11, "Something went wrong."};
}
但顾名思义,这不是很干净,为了保留一个全局对象(本质上(,这样我就可以通过引用将我的类型用作可选的可变参数。
我尝试研究 boost 是如何用 boost::system::error_code
做到这一点的,但我在那里找不到任何静态对象,那么 boost 是如何做到这一点的呢?什么是清洁方法?
你可以用手写出重载:
void do_stuff_optionally(/*params,*/ my_error_code& ec);
void do_stuff_optionally(/*params */) {
my_error_code ec;
do_stuff_optionally(/*params,*/ ec);
}
也就是说,如果你的函数没有返回任何内容,你可以直接返回更干净的错误代码。如果它返回其他内容,您可以返回对象或带有boost::variant
的错误代码。
最后,你应该知道,由于你使用的是 boost,boost 经常使用这种重载约定,错误代码通过引用传递而不是不传递,意思是:如果你没有传入错误代码,那么抛出来指示错误。您使用相同的约定来表示(afaics(忽略错误,这可能有点风险(我认为(。
去掉const
,并使用指针而不是引用:
struct my_complicated_obj {
void do_stuff(/*params,*/my_error_code& ec){
do_stuff_optionally(/*params,*/ &ec);
}
void do_stuff_optionally(/*params,*/ my_error_code *ec = nullptr){
if (ec)
*ec = {0x20, "Something is wrong."};
}
};
让调用方决定是否需要错误代码。
相关文章:
- 新分配指向函数的指针是否合法?
- 变体 - 分配新值时是否清理旧值?
- 分配新的零大小数组可以具有有效价值吗?
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 在函数返回中返回对新分配的shared_ptr的尊重合法吗
- 如何删除新分配的字符,这也是函数返回值?
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- 每次我分配新的位置时,都会隐式地称为destuructor
- 为什么这个指针到指针的二维数组像这样分配新的 int
- 如何创建对象变量,以便每次分配新的指针
- C 新操作员分配新内存
- 编译器忽略运算符新分配
- 方法向量的新/分配的复杂性::p ush_back
- 有没有一种方法可以全局填充新分配/删除分配
- 调用时为 std::function 分配新值
- 为什么我的新分配指针会自动在程序退出上删除
- 如果我尚未为指针分配新值,是否需要删除指针?
- OpenCV:为矩阵元素分配新值
- 在避免新分配的同时,const变量的复杂初始化