gpt4 book ai didi

c++ - 使用 boost::ref 来指示编码约定中的意图

转载 作者:太空狗 更新时间:2023-10-29 21:03:38 25 4
gpt4 key购买 nike

当函数将非常量引用作为参数时,它可能会创建难以阅读的代码,因为在调用站点上,哪些输入可能会更改并不明显。这导致一些代码约定强制使用指针来代替,例如

void func(int input, int* output);

int input = 1, output = 0;
func(input, &output);

代替

void func(int input, int& output);

int input = 1, output = 0;
func(input, output);

就我个人而言,我讨厌使用指针,因为需要检查是否为 null。这让我想知道是否可以使用 boost::ref(或 C++11 的 std::ref)来表示意图,如下所示:

void func(int input, int& output);

int input = 1, output = 0;
func(input, boost::ref(output));

这将用作公司编码约定。 我的问题是,有什么理由可以说明这不是一个好主意吗?

最佳答案

这不是一个坏主意,但并没有真正强制执行(正如 PiotrNycz 指出的那样)。它实际上只是一条评论。

不过我们可以做得更好:

template <typename T>
class output_argument
{
public:
template <typename U>
friend output_argument<U> out(U& ref);

T& get() const
{
return mRef;
}

operator T&() const
{
return get();
}

private:
explicit output_argument(T& ref) :
mRef(ref)
{}

output_argument& operator=(const output_argument&); // not defined

T& mRef;
};

template <typename U>
output_argument<U> out(U& ref)
{
return output_argument<U>(ref);
}

给予:

void foo(int x, output_argument<float> f)
{
int i = static_cast<int>(f);

f.get() = static_cast<float>(i + x);
}

int main()
{
float f = 5.0f;

//fails: foo(1, f);
foo(1, out(f));
}

但通常这些类型的实用程序不是必需的,因为函数名称应该传达参数发生了什么:swap(x, y) 非常清楚地修改了参数!并且返回值应该使用返回类型来完成,进一步限制了可以使用该实用程序的情况。

关于c++ - 使用 boost::ref 来指示编码约定中的意图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13186580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com