如何将复杂函数应用于一个函数模板的模板参数,以便它可以用作另一个函数模板中的模板参数?我是模板的新手,所以请耐心等待。
在下面的代码中,我调用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函数。
答案 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)>();
应该可行。