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

时间:2012-02-24 17:18:15

标签: c++ templates template-meta-programming

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

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

有可能吗?

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

修改

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

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

3 个答案:

答案 0 :(得分:8)

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

  

模板模板参数的模板参数应为   类模板或别名模板的名称,表示为   id-expression。当template-argument命名一个类模板时,   匹配模板时仅考虑主类模板   带有相应参数的模板参数;局部   即使参数列表匹配,也不考虑特化   模板模板参数的那个。

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

只要template< typename T1, typename T2, typename T3> someTemplate评估某些实际的类没有错误,您就可以根据需要使用它,在其他模板中使用它。

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