提问人:Daemon 提问时间:7/5/2023 更新时间:7/5/2023 访问量:19
解释 boost value_factory中函数调用算子的实现
Explain implementation of function call operator in boost value_factory
问:
我正在尝试理解工厂设计模式的提升实现。Boost 提供了两种类型的工厂,一种用于指针类型,另一种用于值语义。我能够对模板value_factory类有所了解。但是,我面临的困难是理解如何在类和命名空间之外定义。operator()(..)
删除大量包含后的代码片段。
# 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()(...)
- 它是课外的
- 它在第二个条件块中定义
# else // defined(BOOST_PP_IS_ITERATING)
根据我的理解,成员函数应该在类中。operator()(...)
答:
1赞
Ted Lyngmo
7/5/2023
#1
它是在类内部定义的。诀窍在于头文件包含自身,并使用宏魔术最终终止递归。
类定义的末尾有这一行,它将递归地自身,直到 d 为止。该包含 t 的结果将转到标记的位置:#include BOOST_PP_ITERATE()
#include
BOOST_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&> { };
}
评论