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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将一个函数模板的模板参数映射到另一个函数模板的参数(c ++)相关的知识,希望对你有一定的参考价值。

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

在下面的代码中,我调用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函数。

答案

当然,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)>();应该可行。

以上是关于将一个函数模板的模板参数映射到另一个函数模板的参数(c ++)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法“强制” MatrixBase::eval 在模板函数参数上发生?

Django框架中的视图和模板

将可变参数函数模板参数传递给另一个函数

模板函数将参数函数指针指向类方法

如何将构造函数(可变参数)作为模板参数传递?

实现一个可以存储其函数参数的仿函数模板