如何使用类似参数的列表删除参数冗余?

时间:2018-03-28 14:28:57

标签: c++ templates

我在删除一系列C ++日志记录功能中的冗余时遇到问题。它们是改变第一个参数的每个变体,以及最终参数的形式。我在想某种可变模板的变体可能有所帮助。

两个基本功能:

void error( util::source_provider const & where, std::string const & reason )
void error( util::source_location const & where, std::string const & reason )

第一个参数在source_providersource_location之间有所不同。这些是基本结构,没有虚拟结构。在reason后,我有几个看起来像这些的函数(包括位置和提供者版本):

void error( util::source_provider const & where, std::string const & reason,
    std::vector<item> const & itemsA, 
    std::vector<item> const & itemsB,
    boost::optional<item> item0 = boost::optional<item>(),
    boost::optional<item> item1 = boost::optional<item>() )
void error( util::source_provider const & where, std::string const & reason,
    std::vector<item> const & itemsA,
    boost::optional<item> item0 = boost::optional<item>(),
    boost::optional<item> item1 = boost::optional<item>() )
void error( util::source_provider const & where, std::string const & reason,
    boost::optional<item> item0 = boost::optional<item>(),
    boost::optional<item> item1 = boost::optional<item>() )

我试图让调用者以任何形式提供这些item条目的列表。这些信息来自各种各样的地方,如果需要汇总到一个列表中,它就会在呼叫站点爆炸。其中一些也是通过调用记录器的宏添加的。

我使用哪些功能组合来减少这种情况?我猜我需要一个带有变体的vardiac模板,以接受矢量或项目。

为清楚起见,这些函数最终都调用了这个函数,首先将所有item args合并为一个向量:

virtual void error_impl( boost::optional<util::source_location> where, std::string const & reason,
        std::vector<item> const & items ) = 0;

C ++ 14没问题。我正在使用GCC 5.4,所以我不认为所有的C ++ 17都可用。

0 个答案:

没有答案