gpt4 book ai didi

c++ - 具有多种返回类型的函数

转载 作者:太空狗 更新时间:2023-10-29 20:22:10 26 4
gpt4 key购买 nike

我有两个枚举,它们基本上确定(在运行时)要做什么。 “映射”看起来像

struct Foo { class CA; class CB; class CC; CA a; CB b; CC c; };
enum Base { A, B, C };
enum Func { X, Y };
Foo foo;

// A, X => use(foo.a.x());
// A, Y => use(foo.a.y());
// B, X => use(foo.b.x());
// B, Y => use(foo.b.y());

问题是,a , bC ,以及 x() 的返回类型和 y()都是不同的类型(一些非常大的模板类型)。

使用 switches 或 ifs 映射两个枚举是非常丑陋的,需要很多努力,所以我想知道,如果我能以某种方式写出这样的东西:

struct Foo { class CA; class CB; class CC; CA a; CB b; CC c; };
enum Base { A, B, C, };
enum Func { X, Y, };

template <typename T> auto applyFunc(Func f, T t)
{
switch(f)
{
case X: return t.x();
case Y: return t.y();
}
}


auto getBase(Base b, Foo f)
{
switch(b)
{
case A: return f.a;
case B: return f.b;
case C: return f.c;
}
}


Func f;
Base b;
Foo foo;

use(applyFunc(f, getBase(b, foo)));

编辑 1:我无法编辑类 CA , CBCC .我也无法编辑 x() 的类/返回类型和 y() .所有这些类型都来自外部库。

最佳答案

您可以使用连续传递样式。

template <class F> void applyFunc(WhichFunc w, T t, F f)
{
switch(w)
{
case X: f(t.x());
case Y: f(t.y());
}
}

template<class F>
void getBase(Base b, Foo foo, F f)
{
switch(b)
{
case A: f(foo.a);
case B: f(foo.b);
case C: f(foo.c);
}
}

您无需返回,而是将下一步作为参数传递给上一步。

Func f;
Base b;
Foo foo;

getBase(b, [&](auto&&b){ applyFunc( f, b, [&](auto&& r){ use(r); } ); } );

或类似的(可能有拼写错误)。

std::variant (或提升)可用于将延续移动到返回值之后。

auto b = getBase(b);
auto r = visit( b, [&](auto&& b){ return applyFunc( f, b ); } );
visit( r, [](auto&& r){ use(r); } );

上面的每一个都返回一个 variant<possible_return_types_go_here> 而不是延续, .

关于c++ - 具有多种返回类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39224646/

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