【问题标题】:Using boost::optional arguments as parameters in template functions在模板函数中使用 boost::optional 参数作为参数
【发布时间】:2015-11-22 20:44:41
【问题描述】:

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

【问题讨论】:

    标签: c++ boost optional optional-parameters


    【解决方案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
    }
    

    你可以看到这个编译并推导出doubleT here。请注意,它不会链接,因为我删除了func 的定义,以便示例显示推导的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多