【问题标题】:templated member function to boost multi index container用于提升多索引容器的模板化成员函数
【发布时间】:2010-01-28 08:48:05
【问题描述】:

因此,我有一个 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::*)().

在标记的行..

好的。事实证明这是我的错,因为我提交了一个签名错误的“&Object::name”参数……我已经解决了这个问题……

【问题讨论】:

  • 您可能会考虑为您的模板参数找到一个更难与数字文字混淆的名称。
  • 嗨,大卫,我同意。我只为我的例子选择了这些论点。

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


【解决方案1】:

更改类定义。

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

并使用KM 而不是&amp;KM

【讨论】:

  • 阿列克谢。这几乎奏效了..我现在遇到了一个不同的错误。我已经用您的示例编辑了我的帖子以显示错误。
  • Alexy.. 我不应该怀疑你.. 我收到的编译器错误是由于容器中使用的对象具有错误的签名......
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多