10

假设我们有一个模板函数:

template<typename T1, typename T2, typename T3>
T3 such_fun(T1 a, T2 b) {
    // do something...
}

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

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...
}

是否可以?

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

编辑:

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

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

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

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...
}
4

3 回答 3

8

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

模板模板参数的模板参数应该是类模板或别名模板的名称,表示为 id-expression 。当 template-argument 命名类模板时,将模板模板实参与对应的形参匹配时,只考虑主类模板;即使参数列表与模板模板参数的参数列表匹配,也不考虑部分特化。

第一段只明确提到了类模板。我想这也不值得麻烦,因为您已经可以使用函数或 astd::function作为参数来做一些非常相似的事情。

于 2012-02-24T17:27:52.327 回答
1

C++ 中的模板在编译时使用具体类型进行编译。他们必须为人所知。

这表示您可以通过传递可以推导出参数的函数模板来进一步使用您的部分解决方案。请注意,这与使用具体类型显式传递函数没有什么不同,您只需键入更少。

template<typename T>
T square(T a, T b)
{
    return a * b;
}

template<typename T, T (*some_function)(T, T)>
T test(T a) 
{
   return square (a, a);
}

void main()
{
    int a = test<int, square>(2);
    float b = test<float, square>(2.2f);
}
于 2012-02-24T17:49:37.167 回答
0

只要template< typename T1, typename T2, typename T3> someTemplate对某个实际类的评估没有错误,您就可以在其他模板内外使用尽可能多的组合。

你试过编译它吗?告诉我们你得到了什么错误(和具体示例)

于 2012-02-24T18:02:56.363 回答