1

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

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

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

以类型安全的方式实现这一点的最佳方法是什么?

编辑

我也意识到我可以为此使用模板专业化,但我不想最终定义相同的结构 9 次,每个额外的模板参数一个。这太乱了。如果可能的话,我想避免这种情况。

4

1 回答 1

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制作副本),您可以求助于 good old boost::ref

然后你LogDebugMessage会看起来像这样:

template<class Tuple>
void LogDebugMessage(std::string const& msg, Tuple const& args);

之后,您将使用类似于我的元组打印机的递归解包元组。请注意,仅operator<<实际使用可变参数模板,并且仅用于获取std::tuple. 您很可能只使用该print_tuple部件。

于 2012-03-07T21:10:50.400 回答