C++ 在模板函数中使用boost::可选参数作为参数
我有一个从文件中读取各种类型参数的函数,我希望能够提供默认参数。使用简单的默认函数参数不是一个好的解决方案,因为无法在函数中区分参数是指定的还是使用了默认值。所以我想我应该使用C++ 在模板函数中使用boost::可选参数作为参数,c++,boost,optional,optional-parameters,C++,Boost,Optional,Optional Parameters,我有一个从文件中读取各种类型参数的函数,我希望能够提供默认参数。使用简单的默认函数参数不是一个好的解决方案,因为无法在函数中区分参数是指定的还是使用了默认值。所以我想我应该使用boost::optional。我有一个函数,看起来像 template <typename T> void func(T& out, boost::optional<T> def_val) { // do stuff } 模板 无效函数(T&out,boost::可选定义值){ //做
boost::optional
。我有一个函数,看起来像
template <typename T>
void func(T& out, boost::optional<T> def_val) {
// do stuff
}
模板
无效函数(T&out,boost::可选定义值){
//做事
}
但这在类型扣除时失败,例如
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
doublex;
func(x,3.0);//错误:无法将可选项与双精度匹配
func(x,boost::可选(3.0));//好吧,但是太冗长了
func(x,3.0);//还可以,但仍然不理想
这让我感到惊讶,我认为第一个
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
}
模板
结构id{typedef T type;};
模板
无效函数(T&out,boost::可选定义值){
//做事
}
您可以看到此编译并推断T
的double
。请注意,它没有链接只是因为我删除了func
的定义,以便示例显示推断的类型