嵌套c++函数模板和typename模板



我试图在c++17中嵌套模板,我想在函数上模板,但也在这些函数可以接受的参数上模板。

下面是我正在尝试做的一个最小复制示例。

首先我做了一个函数模板。这部分我已经做到了。

double add(double x, double y){return x+ y;}
double diff(double x, double y){return x - y;}
template <double fn1(double, double), double fn2(double, double)>
double combine(double x, double y) {
return fn1(x, y) + fn2(x, y);
}

我设法这样使用它:

auto z = combine<add, diff>(x, y);

现在我还想使用模板来支持我传递的函数中的差异浮点精度。首先我在add和diff函数上创建一个模板

template <typename T>
T add(T x, T y){return x+ y;}
T diff(T x, T y){return x - y;}

但是我被困住了。我如何修改组合功能的工作?我的第一个想法行不通

template <typename T,T fn1(T, T), T fn2(T, T)>
T combine(T x, T y) {
return fn1(x, y) + fn2(x, y);
}

这里是我试图做的一个最小的复制示例

嗯,不完全是。

T diff(T x, T y){return x - y;}之前缺少template <typename T>,并且没有显示如何调用模板化的combine。如果你试图使用相同的

auto z = combine<add, diff>(x, y);

模板参数T不能推导。

可以在调用combine时传递所有模板参数:

float x = combine<float, add, diff>(1.0f, 3.14f); // -> 2
或者使用别名
auto& z = combine<double, add, diff>;
float x = z(3.5, 5.17); // -> 7

例如:https://godbolt.org/z/b1ETqbj9c

最新更新