我现在坚持使用C ++ 03,我想创建一个接受任意数量的类型安全参数的全局函数(如果需要,可以达到合理的限制,例如9 )。
我可以在我的代码库中访问完整的boost库,所以我希望boost::mpl::vector
在这里很有用。我也不希望这样写起来太不方便。呼叫站点的语法应该很简单:
LogDebugMessage("Number of cats and dogs:", m_myPets->NumCats(), m_myPets->NumDogs());
以类型安全的方式实现此目的的最佳方法是什么?
修改
我也意识到我可以使用模板专门化,但我不想最终定义相同的结构9次,每个附加模板参数一次。这对此非常麻烦。如果可能的话,我想避免这种情况。
答案 0 :(得分:1)
最好的方法是9次重载。 :P
然而,最简单的方法是boost::tuple
而不是boost::mpl
,因为mpl
主要是编译时间。然后,呼叫站点(用户)将编写类似
LogDebugMessage("Number of cats and dogs:",
boost::tie(m_myPets->NumCats(), m_myPets->NumDogs()));
tie
创建一个引用元组。或者,如果电话涉及临时电话:
LogDebugMessage("Number of cats, dogs and birds:",
boost::make_tuple(m_myPets->NumCats(), m_myPets->NumDogs(), 0));
如果记录的类型有点重(boost::make_tuple
复制),您可以求助于好的boost::ref
。
您的LogDebugMessage
看起来像这样:
template<class Tuple>
void LogDebugMessage(std::string const& msg, Tuple const& args);
之后,您将使用类似于my tuple printer的递归解压缩元组。请注意,只有operator<<
实际上使用了可变参数模板,并且只能这样才能选择std::tuple
。您很可能只使用print_tuple
部分。