gpt4 book ai didi

c++ - 如何在 c++(0x) 中使用多个返回值进行初始化

转载 作者:可可西里 更新时间:2023-11-01 15:27:25 25 4
gpt4 key购买 nike

tuple在 boost 和 TR1/c++0x 中提供了一种方便的(对于函数的编写者)从函数返回两个值的方法——但是它似乎损害了调用者语言的一个主要特性:简单使用的能力初始化变量的函数:

T happy();
const auto meaningful_name(happy()); // RVO means no excess copies

但对于:

tuple<T,U> sad();

我们要么放弃为我们的返回值选择一个有意义的名称的能力,并使用 get<n>()无处不在:

const auto two_unrelated_things(sad());

或者做一个临时的:

const auto unwanted_named_temporary(sad());
const auto one_name(get<0>(unwanted_named_temporary));
const auto two_name(get<1>(unwanted_named_temporary));

或从初始化切换到赋值,这仅在类型可赋值时有效,并且会中断 auto :

tuple_element<0, decltype(sad())>::type one_mutable; // there might be a less
tuple_element<1, decltype(sad())>::type two_mutable; // verbose way
tie(one_mutable,two_mutable) = sad();

或者对本地类做一些不自然的事情:

const struct ugh { 
ugh( decltype(sad()) rhs ) : one_name(get<0>(rhs)), two_name(get<1>(rhs)) {}
const tuple_element<0, decltype(sad())>::type one_name;
const tuple_element<1, decltype(sad())>::type two_name;
} stuff(sad()); // at least we avoid the temporary and get initialization

有没有更好的方法?我在上面使用 VC10 兼容结构,完整的 c++0x 或 boost 有什么帮助吗?

理想情况下:

  • 允许我使用初始化,而不仅仅是赋值
  • 调用者选择返回变量的名称
  • 不制作多余的拷贝
  • 为堆栈变量和类成员工作
  • 可能是一个疯狂的大模板库,但对于调用者和函数编写者来说语法是正常的

最佳答案

std::tuple<Type1, Type2> returnValue = sad();
Type1& first = std::get<0>(returnValue);
Type2& second = std::get<1>(returnValue);

我不确定你的第四个项目符号是什么意思,但它满足所有其他项目符号。

*编辑:根据您上面的评论,我明白了您所说的第四个项目符号的意思。

struct Object {
Object(const std::tuple<Type1, Type2>& t) : value(t) { }
Type1& First() { return std::get<0>(value); }
Type2& second() { return std::get<1>(value); }
private:
std::tuple<Type1, Type2> value;
}

根据需要修改。

如果返回值如此不相关以至于您必须将它们分开以便合理使用它们,您也可以根本不使用 std::tuple。多年来,人们一直在返回具有合理命名字段的 struct,或者通过接受输出的引用参数。

顺便说一句,您似乎爱上了auto。别这样这是一个很棒的功能,但不是应该使用它的方式。如果您不时不指定类型,您的代码最终会变得难以辨认。

关于c++ - 如何在 c++(0x) 中使用多个返回值进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429670/

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