我有一组函子用于计算对象范围内的特定内容。本质上,每个仿函数都实现operator()
:
template <typename Iterator1,
typename Iterator2> double operator()( Iterator1 it1,
Iterator2 it2 ) const
{
return( 0.0 );
}
我现在有一组可以用不同的仿函数创建的对象。我通过模板创建者函数解决了这个问题:
template <class Functor> Foo createFoo( ... // some parameters for foo objects
Functor f = Functor() )
{
// calculate stuff for "foo" using functor "f"
}
我现在想将函子选择委托给我的程序的用户,所以我决定创建一个函子工厂。给定一个仿函数的描述性名称,我想创建适当的仿函数,以便它可以用于创建所有Foo
对象,如上所述。
不过,这就是我卡住的地方:我无法创建一个返回模板仿函数的工厂,因为如果不编码我想要创建的确切类型的仿函数,我就无法调用这个函数。
我考虑过创建operator()
某个基类的虚函数,即FunctorBase
,但我不希望与虚函数调用相关的性能开销。避免上述开销是我首先选择使用模板的原因。
我在这里陷入僵局,肯定会感谢一些评论。
编辑:
我打算做什么(无效代码):
DistanceFunctor f = createFunctor( "Bar" ); // Create a functor from a client-supplied string
Foo createFoo( ..., // parameters for foo
f );
在评论中,还建议使用虚函数。但是,如上所述的当前仿函数设计不适用于虚函数,因为编译器无法使函数模板为虚拟。调整仿函数类以将两个迭代器类型作为模板参数是可能的,但非常笨拙。
编辑:
仿函数的工作方式与 FLANN 中使用的类似。有关示例,请参见 git 存储库。我看不出如何以不同的方式指定这些函子。