gpt4 book ai didi

c++ - 如何使模板函数成为另一个模板函数的参数?

转载 作者:行者123 更新时间:2023-11-30 00:35:33 24 4
gpt4 key购买 nike

我有一个包含各种算法的类:

class Algorithm{

Algorithm()=delete;

public:
template <typename IntegerType>
static IntegerType One(IntegerType a, IntegerType b);

template <typename IntegerType>
static IntegerType Two(IntegerType a, IntegerType b);

template <typename IntegerType>
static IntegerType Three(IntegerType a, IntegerType b);

// ...
};

可以这样调用:

int main(){

Algorithm::One(35,68);
Algorithm::Two(2344,65);
//...
}

现在我想制作一个函数,它将接受任何“算法”函数,并在调用该函数之前和之后执行相同的步骤。
这是我所拥有的:

template <typename IntegerType>
void Run_Algorithm(std::function<IntegerType(IntegerType,IntegerType)>fun, IntegerType a, IntegerType b){
//... stuff ...
fun(a,b);
//... stuff ...
return;
}

当我尝试这样调用函数时:

Run_Algorithm(Algorithm::One,1,1);

我得到的错误是:

cannot resolve overloaded function ‘One’ based on conversion to type ‘std::function<int(int, int)>’

如何设置一个通用例程,将所需算法作为参数?

编辑:
This solution按预期工作。它看起来像这样:

template <typename IntegerType>
void Run_Algorithm(IntegerType(*fun)(IntegerType, IntegerType), IntegerType a, IntegerType b){
//... stuff ...
fun(a,b);
//... stuff ...
return;
}

最佳答案

函数模板的名称,如Algorithm::One , 在这里被视为一组重载函数的名称。要从该集中选择一个重载,您需要将该名称放在需要特定函数类型(签名)的上下文中。这对于 std::function 是不可能的,因为它可以在其 ctor 中接受任何参数(具有一些“可调用”要求)。

此外,使用 std::function因为参数类型不是必需的,如果函数是模板则没有用。它只会添加一个不必要的类型删除和一个间接级别。传递函数的标准用法是:

template <typename Fun, typename IntegerType>
void Run_Algorithm(Fun fun, IntegerType a, IntegerType b);

但这并不能帮助您从重载集中选择一个重载。您可以在调用站点选择过载,如 Dieter Lücking suggested , 然后使用这个成语。

但是,您可以提供重载/或者:

template < typename IntegerType >
void Run_Algorithm(IntegerType(*)(IntegerType, IntegerType),
IntegerType, IntegerType);

如果可能的话,哪个更专业,因此更受欢迎。在这里,函数类型严格是 IntegerType(IntegerType, IntegerType) ,因此编译器可以选择重载集的重载(来自名称 Algorithm::One )。

注意:根据 [temp.deduct.type]/5,IntegerType在参数 Algorithm::One 的非推导上下文中的第一个参数中.所以用第二个和第三个参数推导出IntegerType .这样推导之后,函数类型就完全指定了,可以选择重载了。

问题仍然存在:1) 这是否是您想要的,以及 2) 是否有更好的方法来完成您打算做的事情。

关于c++ - 如何使模板函数成为另一个模板函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18684487/

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