在模板函数中使用 boost::optional 个参数作为参数

Using boost::optional arguments as parameters in template functions

我有一个函数可以从文件中读取各种类型的参数,我希望能够提供默认参数。使用简单的默认函数参数不是一个好的解决方案,因为不可能在函数中区分是指定了参数还是使用了默认值。所以我想我会使用 boost::optional。我有一个看起来像

的函数
template <typename T>
void func(T& out, boost::optional<T> def_val) {
 // do stuff
}

但这在类型推导时失败了,例如

double x;
func(x, 3.0); // error: could not match optional against double
func(x, boost::optional<double>(3.0)); // ok but way too verbose
func<double>(x,3.0); // ok and better but still not ideal

让我感到惊讶的是,我认为第一个 out 参数足以让编译器推断 T = double 并正确解析第二个参数。有什么办法可以很好地做到这一点吗?

模板具有类型推导的精确匹配。在你的例子中 intdoubleT 的两种可能性,所以编译器会给你一个错误。在该语言的其他部分,编译器将尝试找到通用类型(对于 intdouble,这是 double),但不会用于模板类型推导。

您可以使用简单的包装器阻止第二个参数参与类型推导,而编译器通常不可能从中推导类型:

template<typename T>
struct id {typedef T type;};

template <typename T>
void func(T& out, boost::optional<typename id<T>::type> def_val) {
 // do stuff
}

你可以看到这个编译和推导double for T here。请注意,它不 link 只是因为我删除了 func 的定义,以便该示例显示推导的类型。