将一个函数模板的模板参数映射到另一个函数模板的模板参数(c ++)

时间:2018-06-03 14:18:54

标签: c++ c++11 templates

如何将复杂函数应用于一个函数模板的模板参数,以便它可以用作另一个函数模板中的模板参数?我是模板的新手,所以请耐心等待。

在下面的代码中,我调用foo<1,2>(),这会生成一个函数,并在该函数体内调用生成的bar<2>()函数。对我来说问题是我有一个复杂的功能,据我所知,无法使用标准算术运算符进行评估。

我可以使用c ++ 11,如果有帮助的话。

#include <iostream>

template<size_t c>
unsigned int bar(){
    return c;
}

template<size_t a, size_t b>
unsigned int foo(){
    return bar<a*b>();
    //return bar<COMPLICATEDFUNCTION(a,b)>();   // what I actually want to do
}

int main(void) {

    std::cout << foo<1,2>();
    return 0;
}

如果有帮助,我的特定函数是f(r,c)= r * c - c - (c选择2),它计算非方形矩阵(r> c)的低对角线元素的数量。我写的用来计算它的函数可以声明为inline,但据我所知,编译器不承诺这一点。在之前的一个问题中,我询问过使用宏功能,这遭到了怀疑。此外,在同一个线程中,建议使用constexpr函数。

1 个答案:

答案 0 :(得分:2)

当然,constexpr是你的救世主。使用以下定义:

constexpr size_t fact(size_t x) {
  return (x == 0 || x == 1) ? 1 : x * fact(x - 1);
}

constexpr size_t choose(size_t n, size_t k) {
  return fact(n) / (fact(k) * fact(n - k));
}

constexpr size_t complexfunc(size_t r, size_t c) {
  return r * c - c - choose(c, 2);
}
假设C ++ 11,

调用bar<complexfunc(a,b)>();应该可行。