在C++中将函数模板用作模板模板参数

5
假设我有一个具有模板模板参数的函数,就像这样:
template <template <class T> class F, typename P>
void applyFunction(int param)
{
    F<P> fn;
    fn(param);
}

以上代码可以采用任意Functor类模板并应用它。例如,如果我定义了以下内容:
template<typename T>
struct SomeFunctor
{
    void operator()(int param)
    {
        T::doStuff(param);
    }
};

然后我可以进行以下调用:
applyFunction<SomeFunctor, MyClass>(0);

但是我真正想做的是能够传递函数模板(而不仅仅是定义函数对象的类模板)。所以,如果我有这样一个东西:

template<typename T>
void someFunction(int param)
{
    T::doStuff(param);
}

理想情况下,我希望能够做到这样:
applyFunction<someFunction, MyClass>(0);

很遗憾,按照目前的标准,这不是合法的C++。是否有我忽略的方法可以实现这一点?换句话说,传递函数模板而不是类模板作为模板模板参数?从概念上讲,我不明白为什么这不可能。


2
请查看https://dev59.com/qGUo5IYBdhLWcg3w7jIq(严格相关于您的问题) - manlio
1个回答

6
您可以将函数指针作为模板参数传递:

您可以将函数指针作为模板参数传递:

template < typename T, T (*F)(int) >
void apply_function(int param) {
    F(param);
}

template < typename T >
T some_function(int param) {
    T::doStuff(param);
}    

int main() {
    apply_function< float, some_function >(5);
}

在你的情况下,应该是这样的:
apply_function< MyClass, some_function >(0);

那么举个例子。

很有趣。这不完全是我要找的,因为推断出的参数类型是函数指针 - 所以它不能像上面我的代码中的Functor对象那样内联。尽管如此,我还是会点赞的,因为你向我展示了一种只传递函数模板而不是函数本身的方法(即some_function而不是some_function<MyType>),并且它实际上可以按照你的期望工作(我已经编译了一个稍微修改过的版本)。 - Smeeheey
1
@Smeeheey,现代编译器在内联函数指针方面表现得非常出色,特别是在静态上下文中使用时。在编译器资源管理器上尝试一下,你会发现即使在他们可用的最旧版本中,GCC也可以内联使用类似上述的函数指针。编译器内部完全不关心语言级别上例如引用和指针之间的差异,或者静态成员与自由函数之间的差异。 - Alex Celeste
@Leushenko,你说得很对,我使用编译器浏览器验证了这一点(这是一个非常好的工具)。基于此,我接受上面的答案。 - Smeeheey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接