是否可以将函数模板作为模板参数传递?

Woj*_*tak 10 c++ templates template-meta-programming

让我们假设,我们有一个模板功能:

template<typename T1, typename T2, typename T3>
T3 such_fun(T1 a, T2 b) {
    // do something...
}
Run Code Online (Sandbox Code Playgroud)

现在我们想将它用作另一个模板中的参数,例如像那样

template<typename T1, template<typename, typename, typename> some_function>
void big_fun(T1 a) {
   // some code...
   a = some_function<T1, T1, T1>(a, a);
   // some code...
}
Run Code Online (Sandbox Code Playgroud)

可能吗?

我知道我可以使用带有defined()运算符的结构.我只是对功能感到好奇.

编辑:

当我写这个问题时,我的朋友发现了一个部分解决方案:

template<typename T1, T1 (*some_function)(T1, T1)>
void big_fun(T1 a) {
   // some code...
   a = some_function(a, a);
   // some code...
}
Run Code Online (Sandbox Code Playgroud)

但是仍然 - 如果没有在调用之前实现函数类型的实现,我很好奇.例如 - 我可能想要使用各种类型组合调用传递的模板:

template<typename T1, typename T2, template<typename, typename, typename> some_function>
void big_fun(T1 a, T2 b) {
   // some code...
   a = some_function<T1, T1, T1>(a, a);
   a = some_function<T1, T2, T1>(a, b);
   b = some_function<T2, T2, T2>(b, b);
   b = some_function<T2, T1, T2>(b, a);
   // some code...
}
Run Code Online (Sandbox Code Playgroud)

pmr*_*pmr 8

不,这是不可能的.从N3337的14.3.3开始:

模板template-parameter的template-argument应该是类模板或别名模板的名称,表示为id-expression.当template-argument命名一个类模板时,在将模板模板参数与相应参数匹配时,只考虑主类模板; 即使参数列表与模板模板参数的参数列表匹配,也不会考虑部分特化.

第一段仅明确提到类模板.我想这也是不值得的麻烦,因为你可以用功能或std::function作为参数做一些非常相似的事情.