用 C++17 功能替换 Boost MPL 容器
Replacing Boost MPL containers with C++17 features
我有一些基于 MPL 容器的旧代码,使用 enable_if
来激活一些像这样的调度:
typedef boost::mpl::vector<std::int16_t, std::int32_t, int64_t, float, double, std::complex<float>, std::complex<double> > Types;
template <typename Vector>
typename boost::enable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
}
template <typename Vector>
typename boost::disable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
process<typename boost::mpl::pop_front<Vector>::type>();
}
void outside()
{
process<Types>();
}
所以对于 C++17,我可以使用 constexpr,但我仍然需要在 outside
中传递类型列表。是否有声明容器类型的正确方法以便我可以使用可变参数模板?
可能最简单的转换是将 Boost.MPL 换成 Boost.MP11:
using Types = mp_list<...>;
template <typename L>
void process() {
if constexpr (!mp_empty<L>) {
process<mp_pop_front<L>>();
}
}
我有一些基于 MPL 容器的旧代码,使用 enable_if
来激活一些像这样的调度:
typedef boost::mpl::vector<std::int16_t, std::int32_t, int64_t, float, double, std::complex<float>, std::complex<double> > Types;
template <typename Vector>
typename boost::enable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
}
template <typename Vector>
typename boost::disable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
process<typename boost::mpl::pop_front<Vector>::type>();
}
void outside()
{
process<Types>();
}
所以对于 C++17,我可以使用 constexpr,但我仍然需要在 outside
中传递类型列表。是否有声明容器类型的正确方法以便我可以使用可变参数模板?
可能最简单的转换是将 Boost.MPL 换成 Boost.MP11:
using Types = mp_list<...>;
template <typename L>
void process() {
if constexpr (!mp_empty<L>) {
process<mp_pop_front<L>>();
}
}