gpt4 book ai didi

c++ - 如何在 C++11 的成员函数中实现多态函数?

转载 作者:行者123 更新时间:2023-11-30 05:43:51 26 4
gpt4 key购买 nike

我用的是别人写的框架。该框架使用了一些丑陋的宏。首先,框架使用宏来声明和定义类,如下所示:

#define DECLARE_FUNC(_name, _params) \
class _name \
{ \
static int execute(); \
static int exec_func(_params* param); \
}

#define DEFINE_FUNC(_name, _params) \
int _name::execute() \
{ \
_params p = get_from_global(); \
return exec_func(&p) \
} \
int _name::exec_func(_param* param)

在使用这个框架时我要做的是:

DECLARE_FUNC(foo, database)

DEFINE_FUNC(foo, database)
{
// write business logic here
}

在编写业务逻辑时,我必须从数据库中的不同表中查询信息,并且对查询结果做几乎相同的事情。伪代码如下:

TypeA a = TABLE(t_TypeA)->Query();
if (a.is_valid()) {
// do something with a here
// some local variables are used here
}

TypeB b = TABLE(t_TypeB)->Query();
if (b.is_valid()) {
// do something with b here
// some local variables are used here
}

显然重复代码太多了,这是不好的。所以我的同事使用宏来删除重复的代码。我认为多态 lambda 应该适用于这种情况,但 C++11 不支持多态 lambda。

我的问题:有没有其他方法可以在没有宏的情况下删除重复代码?

更新:其实在源代码中“_params”也是一个宏,它可以展开更多的参数,我这里简化一下。如果扩展参数宏并使用多态 lambda,它看起来像:

int ClassA::exec_func(Database database,
Date date,
Time time)
{
// there are also some local variables, for example:
long second = get_second(date, time);

// polymorphic lambda version
auto handle_table = [&](auto table_type) {
// database, date, time and local variables will be used here
}

handle_table(TableA);
handle_table(TableB);
...
handle_table(TableX);
}

所以 Francis 的解决方案在这种情况下可能行不通。

最佳答案

lambda 可以用类仿函数来编写。

auto l = [&capture](auto param) {/*code*/};

变成这样:

class MyFunctor
{
public:
explicit MyFunctor(const capture_t& capture) : capture(capture) {}

template <typename T>
void operator () (T param) const { /* code */ }
private:
const capture_t& capture; // or by value
};

以后

 auto l = MyFunctor(capture);

关于c++ - 如何在 C++11 的成员函数中实现多态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30067523/

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