我用的是别人写的框架。该框架使用了一些丑陋的宏。 首先,框架使用宏来声明和定义类,如下所示:
#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/