使用默认参数增强list_of

boost list_of with default arguments

本文关键字:list of 增强 参数 默认      更新时间:2023-10-16

我对以下结构有问题:

  struct A {
    int min_version;
    int max_version;
    std::vector<int> nodes;
    A(std::vector<int> _nodes, int _min_version = 0, int _max_version = MAXINT)
      : nodes(_nodes), min_version(_min_version), max_version(_max_version)
    {};
  };
  static std::vector<A> a = list_of<A>
    (list_of (1) (2))
   ;

我得到一个编译器错误,2重载中没有一个可以转换所有参数类型(Visual Studio 2013)。但是,当我为一个或两个默认参数添加值时,它编译得很好:

  static std::vector<A> a = list_of<A>
    (list_of (1) (2), 1)
   ;
那么,让两个默认参数都工作的技巧是什么呢?

当您将list_of<A>(...)替换为list_of(A(...))时,单参数版本的问题变得更加明显:编译器错误变成(GCC):

<>之前列表。在函数' int main() '中:列表。cc:18:30:错误:调用重载的' A(boost::assign_detail::generic_list&) '是不明确的list_of (A (list_of (1) (2)));^列表。抄送:18:30:注:考生为:列表。答:11:3:注:::(std:: vector<int&gt,>int _min_version = 0, int _max_version = INT_MAX)^列表。cc:6:8:注释:A::A(const A&)struct A {^列表。cc:6:8:注:A::A(A&&)之前

这在某种程度上是有意义的:泛型无类型列表*声称可以转换为任何类型;它不会(也可能不会)使用SFINAE来拒绝转换不能工作的类型。

在您的示例中,从无类型列表到A的转换比从无类型列表到std::vector<int>A的转换更好。那么,这种转换当然是行不通的。

当你传递第二个实参时,编译器知道你不可能试图调用复制构造函数。

我个人倾向于在构造函数中添加一个虚拟参数,类似于标准的piecewise_construct_t:

struct from_vector { };
struct A {
  ...
  A(std::vector<int> _nodes, ...) { ... }
  A(from_vector, std::vector<int> _nodes, ...) : this(_nodes, ...) { }
};

你可以写

list_of<A>( from_vector(), list_of (1) (2) )

*当我说"untyped list"时,我当然意识到Boost实际上已经为该列表定义了一个类型,并且c++表达式总是有一个类型。

相关文章: