【问题标题】:Substitute for function wrappers替代函数包装器
【发布时间】:2018-01-30 14:01:47
【问题描述】:

我有一个管理两个连接(源和目标)的 C++ 类。连接上的每个操作都是两个阶段,一个准备阶段和一个提交阶段。我想在两个连接上执行一些操作并使用几乎相同的参数。

即,

mngr::init_conn(int var1, int var2, int var3)
{
    m_conn.prepare_init(source_id, var1, var2, var3);
    m_conn.commit();

    m_conn.prepare_init(target_id, var1, var2, var3);
    m_conn.commit();
}

mngr::update_conn(int var1, int var2)
{
    m_conn.prepare_update(source_id, var1, var2);
    m_conn.commit();

    m_conn.prepare_update(target_id, var1, var2);
    m_conn.commit();
}

请注意,同一个连接对象同时管理源连接和目标连接。连接对象不是我的,我不能更改它。

有没有办法删除方法中的代码重复?我考虑过包装方法,但我想知道是否有一种方法不需要为每个函数生成函数包装器

我想过这样的事情:

mngr::init_wrapper(ID id,int var1, int var2, int var3)
{
    m_conn.prepare_init(id, var1, var2, var3);
    m_conn.commit();
}

mngr::update_wrapper(ID id,int var1, int var2)
{
    m_conn.prepare_update(id, var1, var2);
    m_conn.commit();
}

mngr::init_conn(int var1, int var2, int var3)
{
    init_wrapper(source_id, var1, var2, var3);
    init_wrapper(target_id, var1, var2, var3);
}

mngr::update_conn(int var1, int var2)
{
    update_wrapper(source_id, var1, var2);
    update_wrapper(target_id, var1, var2);
}

您是否有不为每个函数生成函数包装器的方法的想法?

【问题讨论】:

    标签: c++ code-duplication


    【解决方案1】:

    远程for 超过std::initializer_list 怎么样?

    mngr::init_conn(int var1, int var2, int var3)
    {
        for (auto id : {source_id, target_id})
        {
            m_conn.prepare_init(id, var1, var2, var3);
            m_conn.commit();
        }
    }
    

    如果您需要更改for内部的id,则应将其更改为auto &id,否则将丢弃更改。

    【讨论】:

    • 现在我觉得自己很蠢 :) ,我早该想到... tnx :)
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2017-11-05
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多