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

标签 c++ c++11 lambda macros

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

#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/

相关文章:

c++ - 使用 Qt 以编程方式绘制线条

关于设置串口 com 端口的 C++ 问题

c++ - C++ 标准是否要求无符号整数的最大值为 2^N-1 形式?

c++ - 我怎么知道一个目录是VB6中的回收站?

c++ - boost asio async_resolve 对象的生命周期

c# - 关于 lambda 表达式的专家意见 - ViewModels

c++ - boost::shared_ptr 和 std::shared_ptr 共存

c++ - 可以定义一个完全通用的 swap() 函数吗?

c# - Lambda 在加入时不相等

java - 如何从 StackFrameStream 中只获取前两个 stackFrames?