我试图在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