使用boost :: mpl :: vector创建可变参数模板?

时间:2012-03-07 20:59:06

标签: c++ boost boost-mpl boost-tuples

我现在坚持使用C ++ 03,我想创建一个接受任意数量的类型安全参数的全局函数(如果需要,可以达到合理的限制,例如9 )。

我可以在我的代码库中访问完整的boost库,所以我希望boost::mpl::vector在这里很有用。我也不希望这样写起来太不方便。呼叫站点的语法应该很简单:

LogDebugMessage("Number of cats and dogs:", m_myPets->NumCats(), m_myPets->NumDogs());

以类型安全的方式实现此目的的最佳方法是什么?

修改

我也意识到我可以使用模板专门化,但我不想最终定义相同的结构9次,每个附加模板参数一次。这对此非常麻烦。如果可能的话,我想避免这种情况。

1 个答案:

答案 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部分。