我正在尝试根据提供的类型参数评估位集的值。我现在拥有的功能是这样的:

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);
}


基本上,函数意图的要点是能够创建一个位集,其位是基于SetPartialSet的交集创建的,而这两个都是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

09-06 22:37