在模板函数中使用 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
并正确解析第二个参数。有什么办法可以很好地做到这一点吗?
模板具有类型推导的精确匹配。在你的例子中 int
和 double
是 T
的两种可能性,所以编译器会给你一个错误。在该语言的其他部分,编译器将尝试找到通用类型(对于 int
和 double
,这是 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
的定义,以便该示例显示推导的类型。
我有一个函数可以从文件中读取各种类型的参数,我希望能够提供默认参数。使用简单的默认函数参数不是一个好的解决方案,因为不可能在函数中区分是指定了参数还是使用了默认值。所以我想我会使用 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
并正确解析第二个参数。有什么办法可以很好地做到这一点吗?
模板具有类型推导的精确匹配。在你的例子中 int
和 double
是 T
的两种可能性,所以编译器会给你一个错误。在该语言的其他部分,编译器将尝试找到通用类型(对于 int
和 double
,这是 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
的定义,以便该示例显示推导的类型。