【发布时间】:2018-04-22 13:42:35
【问题描述】:
我要解决的问题是根据我要排序的每种类型专用的 constexpr 模板函数的返回值对模板参数包进行排序。
我有一个大约 100 个 BOOST_STRONG_TYPEDEFs 的列表,它们创建了 TYPE_1, TYPE_2, ..., TYPE_N 类型。
BOOST_STRONG_TYPEDEF(TYPE_1, int)
BOOST_STRONG_TYPEDEF(TYPE_2, double)
// et cetera
BOOST_STRONG_TYPEDEF(TYPE_N, uint8_t)
然后我声明一个通用模板constexpr size_t value_of(),我专门针对我的每一种类型:
template<> constexpr size_t value_of<TYPE_1>() { return 1; }
template<> constexpr size_t value_of<TYPE_2>() { return 2; }
// et cetera
template<> constexpr size_t value_of<TYPE_N>() { return n; }
然后我有一个声明如下的类。我需要根据value_of的结果对UnsortedTypes参数包中的每个类型进行排序。
template<typename ...UnsortedTypes>
class MyClass {
typedef boost::mpl::vector<UnsortedTypes...> UnsortedTypeVector;
typedef typename boost::mpl::sort<
UnsortedTypeVector,
boost::mpl::less<
boost::mpl::size_t<value_of<boost::mpl::placeholders::_1>()>,
boost::mpl::size_t<value_of<boost::mpl::placeholders::_2>()>
>
>::type SortedTypes;
// Utility
void print_types() {
__print_types<SortedTypes>();
}
template<typename Type, typename ...Types>
void __print_types() {
std::cout << typeid(Type).name() << "\n";
if constexpr (sizeof...(Types) > 0) __print_types<Types...>();
}
};
当我如下测试时:
int main(int, char *[]) {
MyClass<TYPE_5, TYPE_3, TYPE_4, TYPE_2, TYPE_1> myclass;
myclass.print_types();
}
我收到了这个huge, pretty much unintelligible error message,它似乎包含 mpl 库中的错误。
直觉上,我怀疑这是由于我的排序谓词定义不正确造成的。但是,我不确定如何解决它!
(这是我第一次使用Boost.MPL,网上的例子不多,所以请温柔!)
【问题讨论】:
标签: c++ boost c++17 variadic-functions boost-mpl