gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:31 25 4
gpt4 key购买 nike

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

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

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

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

编辑

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

最佳答案

最好的方法是 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部分。

关于c++ - 使用 boost::mpl::vector 创建可变参数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com