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

时间:2015-11-22 20:44:42

标签: c++ boost optional optional-parameters

我有一个从文件中读取各种类型参数的函数,我希望能够提供默认参数。使用简单的默认函数参数并不是一个很好的解决方案,因为无论是否指定了参数或是否使用了默认值,都无法区分函数。所以我想我会使用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并正确解析第二个参数。有没有办法很好地做到这一点?

1 个答案:

答案 0 :(得分:1)

模板与类型扣除完全匹配。在您的示例中,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 here的编译和推导T。请注意,它不会简单地链接,因为我删除了func的定义,以便示例显示推断的类型。