【发布时间】:2021-10-05 16:44:08
【问题描述】:
我想写一个函数模板,带有一个函数指针类型的可选参数,默认值为operator+。如果在定义了operator+ 的对象上调用该函数,则使用默认值。如果在没有预定义operator+ 的对象上调用该函数,则调用者可以指定一个函数来进行添加。这是我想做的一个例子:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
template <typename T, typename fun=std::plus<T>>
T addT(T t1, T t2, fun f = {}) {
return f(t1, t2);
}
int main()
{
double a = 1., b= 2.;
auto c = addT(a, b); // use default value of std::plus
std::cout<<c<<std::endl;
using vec_int = std::vector<int>;
vec_int x = {1,1}, y = {2,2};
auto vec_int_add = [](vec_int x, vec_int y){
vec_int res;
std::transform(x.begin(), x.end(), y.begin(), std::back_inserter(res), [](int x, int y){return x+y;});
return res;
};
auto z = addT(x, y, vec_int_add); // supply a lambda as argument
std::cout<<z[0]<<','<<z[1]<<std::endl;
}
问题是默认值std::plus 仅在两个参数与上面示例的类型相同时才有效。我希望默认值是具有两种不同类型参数的函数,例如:
template<typename T>
T default_add(T x, double y) {
T res = x + y;
return res
}
我有点不知道该怎么做。
【问题讨论】:
-
你不能只添加一个带有两个参数的重载吗?
template <typename T1, typename T2> auto addT(T1 t1, T2 t2) { return t1 + t2; } -
您可以尝试约束
fun(如果您使用c++20)以便requires(T a, T b, fun f) { f(a,b) } -> std::same_as<T>}或类似的东西。根据您的需要,您也可以大大扩展它。您也可以只将第二个参数转换为T,但这可能会很糟糕,具体取决于您想要做的事情
标签: c++ operator-keyword function-templates