我正在尝试根据提供的类型参数评估位集的值。我现在拥有的功能是这样的:
template <class Set, class PartialSet>
constexpr auto tupleBitset() {
using type =
typename mpl::fold<
PartialSet,
mpl::integral_c<unsigned long long, 0>,
mpl::eval_if<
mpl::has_key<Set, mpl::_2>,
mpl::plus<
mpl::_1,
mpl::integral_c<unsigned long long, 1ull << getIndex<Set, mpl::_2>()>
>,
mpl::_1
>
>::type;
return std::bitset<mpl::size<Set>::value>(type::value);
}
基本上,函数意图的要点是能够创建一个位集,其位是基于
Set
和PartialSet
的交集创建的,而这两个都是mpl::set
。还提供了功能getIndex
:template <class Set, class Index>
constexpr auto getIndex() {
return mpl::distance<
typename mpl::begin<Set>::type,
typename mpl::find<Set, Index>::type
>::type::value;
}
这种方法似乎不起作用,编译错误的评估结果如下:
'value' is not a member of 'boost::mpl::same_as<U1> in 'not.hpp'
'C_': invalid template argument for 'boost::mpl::aux::not_impl', expected compile-time constant expression in not.hpp
左移是否可能不是编译时间常数?
似乎问题出在
getIndex
的调用上,因为mpl::_2
没有被替换。不幸的是,我不知道如何强制替代。 最佳答案
问题是您将place_holder传递给函数getIndex
。
您可以像这样在struct中转换功能
template< typename Set, typename Index > struct getIndex
: mpl::integral_c<unsigned long long, ( mpl::distance<
typename mpl::begin<Set>::type,
typename mpl::find<Set, Index>::type
>::type::value )>
{
};
template <class Set, class PartialSet>
constexpr auto tupleBitset() {
using type =
typename mpl::fold<
PartialSet,
mpl::integral_c<unsigned long long, 0>,
mpl::eval_if<
mpl::has_key<Set, mpl::_2>,
mpl::plus<
mpl::_1,
mpl::shift_left<mpl::integral_c<unsigned long long, 1ull>,
getIndex<Set, mpl::_2>>
>,
mpl::_1
>
>::type;
return std::bitset<mpl::size<Set>::value>(type::value);
}
Demo