解释 boost value_factory中函数调用算子的实现

Explain implementation of function call operator in boost value_factory

提问人:Daemon 提问时间:7/5/2023 更新时间:7/5/2023 访问量:19

问:

我正在尝试理解工厂设计模式的提升实现。Boost 提供了两种类型的工厂,一种用于指针类型,另一种用于值语义。我能够对模板value_factory类有所了解。但是,我面临的困难是理解如何在类和命名空间之外定义。operator()(..)

以下是完整代码的链接:https://github.com/boostorg/functional/blob/7516442815900430cc9c4a6190354e11bcbe72dd/include/boost/functional/value_factory.hpp

删除大量包含后的代码片段。

#   ifndef BOOST_PP_IS_ITERATING
namespace boost
{
    template< typename T >  class value_factory;

    template< typename T >
    class value_factory
    {
      public:
        typedef T result_type;
        value_factory()
        { }
    }; // value_factory
    
    template< typename T > class value_factory<T&>;
} // namespace boost
#   else // defined(BOOST_PP_IS_ITERATING)
    template< BOOST_PP_ENUM_PARAMS(0, typename T) >
    inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(0, T, &a)) const
    {
        return result_type(BOOST_PP_ENUM_PARAMS(N,a));
    }
#   endif // defined(BOOST_PP_IS_ITERATING)

此代码来自 boost 版本 1.71。

我想了解这里是如何发挥作用的operator()(...)

  1. 它是课外的
  2. 它在第二个条件块中定义# else // defined(BOOST_PP_IS_ITERATING)

根据我的理解,成员函数应该在类中。operator()(...)

C++11 模板 成员函数 boost-functional

评论


答:

1赞 Ted Lyngmo 7/5/2023 #1

它是在类内部定义的。诀窍在于头文件包含自身,并使用宏魔术最终终止递归。

类定义的末尾有这一行,它将递归地自身,直到 d 为止。该包含 t 的结果将转到标记的位置:#include BOOST_PP_ITERATE()#includeBOOST_PP_IS_ITERATING#define

#     define BOOST_PP_FILENAME_1 <boost/functional/value_factory.hpp>
#     define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY)
#     include BOOST_PP_ITERATE()              // <- operator() definition goes here

    }; // end of class [my remark]

    template< typename T > class value_factory<T&>;
    // forbidden, would create a dangling reference

} // namespace boost [my remark]

#     define BOOST_FUNCTIONAL_VALUE_FACTORY_HPP_INCLUDED
#   else // defined(BOOST_PP_IS_ITERATING)

// the operator definition in header

如果编译,您还可以看到结果:g++ -E

namespace boost {

template<class T>
class value_factory;

template<class T>
class value_factory {
public:
    typedef T result_type;



    template<class... Args>
    result_type operator()(Args&&... args) const {
        return result_type(std::forward<Args>(args)...);
    }
# 99 "/home/ted/local/include/boost/functional/value_factory.hpp"
};

template<class T>
class value_factory<T&> { };

}