模板化成员函数来提升多索引容器

时间:2010-01-28 08:48:05

标签: c++ boost templates member-function-pointers

我有一个boost多索引容器。

using namespace boost::multi_index;
template < typename O >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, std::string, &O::name >
            >
        >
    > _container;
};

正如您所看到的,通过这种设计,我用来创建此容器的每个对象都必须有一个成员函数,返回一个名为“name”的字符串。

这显然不太理想。我尝试了几种传递“密钥”的方法,但我无法让它们中的任何一种工作......

我试过了..

using namespace boost::multi_index;
template < typename O, typename KT, typename KM >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, KT, &KM >
            >
        >
    > _container;
};

int main( int c, char *v[] )
{
    Container< Object, std::string, Object::name > container;
}

但没有快乐..

编译器抱怨Object :: name不是一个类型,但我不知道如何纠正它。即使我弄清楚如何为模板提供类型,我仍然需要容器使用的“Object :: name”的具体实例。

也许我必须提交类型然后在构造中的成员函数?但是我如何构建容器..我的头痛了!?!

Alexy,下面,请提供此解决方案

using namespace boost::multi_index;
template < typename O, typename KT, KT (O::* KM)() >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, KT, KM >
            >
        >
    > _container;
};

int main( int c, char *v[] )
{
    Container< Object, std::string, &Object::name > container;  // <<---- ERROR HERE
}

然而,这产生了以下编译器错误。

Template parameter KM requires an expression of type std::string (Object::*)().

在标有..

的行

确定。事实证明,这是我的错,通过递交一个错误签名的“&amp; Object :: name”参数......我修复了这个..

1 个答案:

答案 0 :(得分:2)

更改课程定义。

template < typename O, typename KT, KT (O::* KM)() >
class Container 
//...

并使用KM代替&KM