我在删除一系列C ++日志记录功能中的冗余时遇到问题。它们是改变第一个参数的每个变体,以及最终参数的形式。我在想某种可变模板的变体可能有所帮助。
两个基本功能:
void error( util::source_provider const & where, std::string const & reason )
void error( util::source_location const & where, std::string const & reason )
第一个参数在source_provider
和source_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都可用。