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

标签 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 次,每个额外的模板参数一个。这太乱了。如果可能的话,我想避免这种情况。

最佳答案

最好的方法是 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/

相关文章:

c++ - 我如何实现嵌套的 boost::mpl::fold

c++ - 使用 Visitor 对 Boost Variant 中的类型进行分类无法编译

c# - 将 std::wstring 的内容从 C++ 返回到 C#

c++ - C++中的外部模板构造函数

c++ - 运算符重载 Boost ublas Vector

c++ - 在 protected 匿名 union 中的匿名结构中定义的成员仍然公开可见

c++ - uBLAS 慢速矩阵-稀疏 vector 乘法

c++ - 如何使用 VS 2019 Preview 在 Windows 10 中安装 boost

c++ - "cannot find -lQt5Core -lQt5Gui etc"使用其他不相关的库时

c++ - 通过缓存元函数优化编译时性能