【问题标题】:Using boost::mpl::vector to create variadic templates?使用 boost::mpl::vector 创建可变参数模板?
【发布时间】:2012-03-07 20:59:06
【问题描述】:

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

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

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

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

编辑

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

【问题讨论】:

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


    【解决方案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&lt;&lt; 实际使用可变参数模板,并且只是为了获取std::tuple。您很可能只使用print_tuple 部分。

    【讨论】:

    • 为每条日志消息输入 boost::tie() ?我宁愿选择 9 个重载。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多