减轻头文件中的长限定条件
Alleviate long qualifications in header files
我在头文件中定义了一个inline
函数对象,像这样:
// fmap.hpp
namespace util {
inline auto constexpr fmap = boost::hana::curry<2>(boost::hana::flip(boost::hana::transform));
}
客户端代码可以简单地#include "fmap.hpp"
并开始使用util::fmap
。
到目前为止一切顺利。
但有时此类对象的定义可能难以阅读,如果它们充满了 qui::quo::qua::lify
。
我该如何缓解这种情况?
理想情况下,我希望 fmap
的定义如下所示:
namespace util {
inline auto constexpr fmap = curry<2>(flip(transform));
}
但同时我不想在顶层放置 using namespace boost::hana;
,因为 client code's namespace would be cluttered with boost::hana
(or from other namespaces) names, not to mention that 。
是否有一些 C++ 指南或最佳实践可以在这种情况下派上用场?
考虑一下,我可以通过从 void
构建并动态调用一个 lambda 来解决这个谜题(因此 []
和 {}
之间的 ()
可以删除)到所需的 lambda:
namespace utils {
inline auto constexpr fmap = []{
using namespace boost::hana;
return curry<2>(flip(transform));
}();
}
我在头文件中定义了一个inline
函数对象,像这样:
// fmap.hpp
namespace util {
inline auto constexpr fmap = boost::hana::curry<2>(boost::hana::flip(boost::hana::transform));
}
客户端代码可以简单地#include "fmap.hpp"
并开始使用util::fmap
。
到目前为止一切顺利。
但有时此类对象的定义可能难以阅读,如果它们充满了 qui::quo::qua::lify
。
我该如何缓解这种情况?
理想情况下,我希望 fmap
的定义如下所示:
namespace util {
inline auto constexpr fmap = curry<2>(flip(transform));
}
但同时我不想在顶层放置 using namespace boost::hana;
,因为 client code's namespace would be cluttered with boost::hana
(or from other namespaces) names, not to mention that
是否有一些 C++ 指南或最佳实践可以在这种情况下派上用场?
考虑一下,我可以通过从 void
构建并动态调用一个 lambda 来解决这个谜题(因此 []
和 {}
之间的 ()
可以删除)到所需的 lambda:
namespace utils {
inline auto constexpr fmap = []{
using namespace boost::hana;
return curry<2>(flip(transform));
}();
}