gpt4 book ai didi

c++ - 如何使用 Boost MPL 在一个函数中有多个返回点?

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:09 25 4
gpt4 key购买 nike

考虑以下代码:

struct Param {};
struct Base {
virtual char f(Param const &) const = 0;
};
struct A : Base {
explicit A(Param const &) {}
virtual char f(Param const &) const {return 'A';}
};
struct B : Base {
explicit B(Param const &) {}
virtual char f(Param const &) const {return 'B';}
};
struct C : Base {
explicit C(Param const &) {}
virtual char f(Param const &) const {return 'C';}
};

char my_function(Param const & param, Base const & base)
{
if(A const * const p = dynamic_cast<A const *>(&base)) {
return p->f(param);
}
if(B const * const p = dynamic_cast<B const *>(&base)) {
return p->f(param);
}
if(C const * const p = dynamic_cast<C const *>(&base)) {
return p->f(param);
}
return '0';
}

那如果我写

Param x, y;
std::cout << my_function(x, B(y)) << std::endl;

它输出B

我的目标是更改 my_function 的实现,以便它可以支持一组在编译时定义的 Base 子类型。在这里,我手写了我将为 {A, B, C} 类型集获得的扩展代码。我想用一组类型将 my_function 模板化,并这样调用它:

std::cout << my_function<boost::mpl::set<A, B, C> >(x, B(y)) << std::endl;

输出 B,或者,例如:

std::cout << my_function<boost::mpl::set<A, C> >(x, B(y)) << std::endl;

输出 0

我不知道要使用哪个 MPL 构造来实现这个结果。

我最初认为调用 find_if 可以找到集合中的第一个类型,base 可以被 dynamic_casted,但实际上这个算法,就像大多数 MPL算法,静态生成结果,因此显然不能与运行时参数 (base) 一起使用。

唯一被归类为“运行时”的 MPL 算法是 for_each,但我不知道如何使用它来产生与我的多个 return 语句相同的效果(我什至不知道可不可以)。感谢任何可以帮助我的 MPL 演讲者。

PS:不要告诉我应该避免动态转换或者我可以简单地使用

char my_function(Param const & param, Base const & base) {return base.f(param);}

与现实生活中的问题相比,我已经简化了代码示例,我无法更改现有设计。

最佳答案

像这样的东西应该可以工作:

struct functor
{
public:
functor(Param const & param, Base const & base)
: param_(param),
base_(base),
found_(false)
{
}

template<typename Child>
void operator()(Child*)
{
if (!found_)
{
if(Child const * const p = dynamic_cast<Child const *>(&base_))
{
value_ = p->f(param_);
found_ = true;
}
}
}

char get_value()
{
return value_;
}

private:
Param const & param_;
Base const & base_;
bool found_;
char value_;
};

template <typename ...Types>
char my_function(Param const & param, Base const & base)
{
typedef boost::mpl::vector<Types...>::type children;

functor f(param, base);

boost::mpl::for_each<children>(std::ref(f));

return f.get_value();
}

int main()
{
Param x, y;
std::cout << my_function<A*, B*, C*>(x, B(y)) << std::endl;

return 0;
}

关于c++ - 如何使用 Boost MPL 在一个函数中有多个返回点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049646/

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