gpt4 book ai didi

c++ - 使用模板函数作为模板参数

转载 作者:行者123 更新时间:2023-11-28 04:47:06 25 4
gpt4 key购买 nike

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

#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;
}

我选择从 vectype 推导出 scalartype。不一定是您想要的,但它可能是一个选项,具体取决于您的用例。

关于c++ - 使用模板函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com