【发布时间】:2011-10-25 09:46:37
【问题描述】:
我有一些函数模板,例如
template <typename T>
void foo(T);
template <typename T>
void bar(T);
// others
我需要将每一个传递给一个算法,该算法将以各种类型调用它,例如
template <typename F>
void some_algorithm(F f)
{
// call f with argument of type int
// call f with argument of type SomeClass
// etc.
}
我无法在未实例化的情况下传入我的函数模板,但我也无法使用任何特定类型对其进行实例化,因为some_algorithm 需要使用几种不同类型的参数来调用它。
我可以将我的函数模板调整为多态函数对象,例如
struct foo_polymorphic
{
template <typename T>
void operator()(T t)
{
foo(t);
}
};
然后将其作为some_algorithm(foo_polymorphic()) 传递。但这需要为我的每个函数模板编写一个单独的适配器。
是否有一种通用方法可以将函数模板调整为多态函数对象,即我可以为我需要调整的每个函数模板重复使用的某种机制,而不必为每个单独声明一些东西?
【问题讨论】:
-
@Seth:因为这对语言没有意义。
-
Non-type template parameters must be of integral, enumeration, pointer, reference, or pointer to member type, and must be constant at compile time.你不能传递一个未实例化的函数名,主要是因为你不能得到一个指向它的指针。您将不得不使用其他技巧。 -
foo_polymorphic 可以用宏生成以简化任务。
-
我要说的是,没有宏就无法做到这一点。在 C++0x 中如果有多态 lambdas,您只需这样做:
some_algorithm([](auto x){ foo(x);});。那么,从这一点来看,我认为您的问题与其他“我如何模拟 lambdas”问题没有什么不同,只是在您的情况下,您想要更多增强的 lambdas。与模拟 lambda 的情况一样:手动。 :// -
想提一下,上面的结构可能有问题,因为它不完美地将 t 转发到 foo。
标签: c++ templates static-polymorphism function-template