【发布时间】: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