使用模板化函数作为模板参数

Posted

tags:

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

我正在编写一个具有重复调用函数的类,并决定将其作为模板参数赋予函数。作为我正在谈论的具体例子,请考虑以下类:

#include <array>

template<double (*func)(std::array<double,3>)>
class MyClass
{

public:
    MyClass()
    {
        std::array<double,3> v {{0.1,0.2,0.1}};
        func(v);
    }
};

然后可以使用函数对其进行实例化,例如:

double func(std::array<double,3> x)
{
    return x[0]*x[0]+x[1];
}

int main()
{
    MyClass<func> entity;
}

但是,我需要可以使用不同类型调用函数(函数中的操作当然适用于所有函数),也就是说我希望将此函数模板化,如:

template<typename scalartype, typename vectype>
scalartype func1(vectype x)
{
    scalartype res = x[0]*x[0]+x[1];
    return res;
}

我仍然可以使用它作为模板参数,但函数参数和返回类型然后在类中修复。那么如何在类中提供模板化功能?例如,我可以使用四个整数的std::vector调用它并返回一个整数。

我尝试使用模板模板参数,但我甚至无法弄清楚如何使用它们的两个模板参数(因为它们似乎只允许模板...语法)。对不起,我很抱歉,我还是个新人。

答案

您可以将模板函数放在一个类中,然后将该类传递给MyClass

#include <iostream>
#include <vector>
#include <array>

struct templateHolder {
    template <typename vectype, typename scalartype = typename vectype::value_type>
    static scalartype func(vectype x) {
        return x[0] + x[1];
    }
};

template<typename T>
class MyClass
{

public:
    MyClass()
    {
        std::vector<int> vec {1,2};
        std::cout << T::func(vec) << std::endl;

        std::array<double, 2> arr {0.5, 3.33};
        std::cout << T::func(arr) << std::endl;
    }
};

int main() {
    MyClass<templateHolder> foo;
    return 0;
}

我选择从scalartype演绎vectype。不一定是你想要的,但它可能是一个选项,取决于你的用例。

以上是关于使用模板化函数作为模板参数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?

使用模板化可变参数模板参数作为专用参数

接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数

带有 lambda 作为每个实例化的唯一默认参数的模板

为啥我需要在这里指定模板化函数的模板参数类型?

函数模板