发信人: ytj(skywalker), 信区: C
标 题: 一种新的C++惯用法?
发信站: 饮水思源 (2012年04月14日00:51:42 星期六)

Hello all:

我发现了一个C++小技巧,不过我不知道这是不是一个有名的C++惯用法。
有时候我们会这样定义一个函数,为了简单期间,以后我省略所有的(const &)前缀。

void function(Param1 param1, Param2 param2, Res1 &res1, Res2 &Res2, ...);

当参数太多的时候,放在一个struct是一个好做法。

struct Parameter {
Param1 param1;
Param2 param2;
// etc
// 我们当然可以在这里用命名参数惯用法,但这不是重点。
Parameter& set_param1(Param1 _) {
param1 = _;
return *this;
}
};

struct Result {
Res1 res1;
Res2 res2;
// etc
};

// 好了,现在我们可以这么写,清楚多了。
Result function(Parameter param);

现在的问题是,当我们想使用param1时,我们必须写成"param.param1"。
当然我们可以定义一个简单的变量 "const auto &para1 = param.param1;"
解决这个问题,但是我有一个更好的主意:

struct FunctionImpl: Parameter, Result {
using Parameter::param1;
using Parameter::param2;
// etc
using Result::res1;
using Result::res2;
// etc
FunctionImpl(Parameter param): Parameter(param) {
// 我们可以直接用 param1 和 res1 啦.
// Do something here...
}
private:
// 好了,我们甚至可以使用局部函数,但这也不是重点。
}

Result function(Parameter param) {
return FunctionImpl(param);
}

不过我也发现了一个缺点,返回值优化(RVO)似乎在这里不起作用,
所以无论如何都会有一次 Result 的拷贝过程(有可能很昂贵)。
不管怎样,我想知道这是不是一个有名的技巧?或者还有没有其他的缺点?
--

※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 59.78.47.184]