3

对不起,我不能在标题中更具体。

假设我有一个班级 Foo

class Foo {
public:
    Foo() { m_bitset.reset(); }

    void set_i(int i) {
        m_bitset.set(1);
        m_i = i;
    }

    void set_j(int j) {
        m_bitset.set(2);
        m_j = j;
    }
    bool i_set() { return m_bitset(1); }
    bool j_set() { return m_bitset(2); }
    void clear_i() { m_bitset.reset(1); }
    void clear_j() { m_bitset.reset(2); }
    int get_i() {
        assert(i_set());
        return m_i;
    }
    int get_j() {
        assert(j_set());
        return m_j;
    }

private:
    int m_i, m_j;
    bitset<2> m_bitset;
};

现在我想把 Foo 放到一个 multi_index 中。

typedef multi_index_container <
    Foo, 
    indexed_by<
        ordered_non_unique<BOOST_MULTI_INDEX_CONST_MEM_FUN( Foo, int, get_i)
        >,
        ordered_non_unique<BOOST_MULTI_INDEX_CONST_MEM_FUN( Foo, int, get_j)
        >
    >
> Foo_set;

我想要弄清楚的是一种让我的 multi_index 对具有有效值 i 或 j 的 Foo 进行排序的方法(或者在复合键的情况下两者都传递并传递其余部分。所以我不想要下面的代码要炸毁,我只想返回对 i 具有有效值的 foo。

for (Foo_set::nth_index<1>::type::iterator it = foos.get<1>().begin(); it != foos.get<1>().end(); ++it)
    cout << *it;
4

2 回答 2

1

通过浏览 boost multi_index 库文档,我想说这个库无法实现您想要的。从它的基本原理来看,它似乎只用于索引在所有“维度”上完全可索引的元素。(您可以尝试在 boost 用户邮件列表中询问是否有任何黑客允许“稀疏”索引维度。)

无论如何 - 根据您的问题的确切性质,您可以通过使用 boost::optional 作为索引类型来解决它。(尽管我什至不确定是否可以通过 boost::optional 进行索引。)

于 2010-09-06T11:14:16.153 回答
1

当 multi_index 要求or值进行索引时,在assert()您的get_i()and函数中将导致程序硬停止。get_j()ij

听起来您想要 Null Object Pattern 行为。即m_im_j是采用特殊值表示它们未设置的数据类型(如果它们是指针,则NULL指针将用于此目的)。然后您的多索引可以索引这些值,将所有null值集中在一起。

访问数据时,可以使用boost::range过滤掉空值:

// Predicate for null testing
struct is_not_null {
    bool operator()(const Foo& f) { return f.get_i() != NULL && f.get_j() != NULL; }
};

Foo_set::nth_index<1>::type& idx = foos.get<1>();
BOOST_FOREACH(const Foo& f, idx | filtered(is_not_null())) {
    ;// do something with the non-null Foo's
}

如果您不想污染变量的值空间(即没有可以存储的有意义的空值),您还可以考虑将您的m_iandm_j成员转换为boost::optional。通过更多的函子包装,您可以创建一个复合索引<bool, int>,这将允许您分别访问 set 或 unset Foo。您可以进一步组合索引以组合ij使用看起来像 的组合索引<bool, bool, int, int>

于 2011-02-09T22:33:15.197 回答