Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板函数中使用boost::可选参数作为参数_C++_Boost_Optional_Optional Parameters - Fatal编程技术网

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
的定义,以便示例显示推断的类型