使用默认参数增强list_of
boost list_of with default arguments
我对以下结构有问题:
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):
这在某种程度上是有意义的:泛型无类型列表*声称可以转换为任何类型;它不会(也可能不会)使用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++表达式总是有一个类型。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 如何将 std::list of 派生类而不是 std::list of parent class 传递给函数
- 将 std::list of structs 转换为 Python 列表
- 矩阵类:"No instance of overloaded function push_back matches the argument list"
- 如何修复'Size of list( a class) is unknown or zero error'和"声明语法错误"?
- 为什么我会收到错误"parameter pack 'F' must be at the end of the template parameter list"
- 在递归函数中创建 std::list of value 而不是 std::list of 指针
- 将<Point2f> openCV 的向量转换为 Collections::Generic::List<Windows::P oint> of C#
- std::map with iterators to std::list from iterators of std::
- "ISO C++ forbids declaration of 'list' with no type"错误
- "more than one instance of overloaded function " 标准::p ow " matches the argument list"
- MSVC:"use of class template requires template argument list" STL 容器内
- C++:"invalid initialization of non-const reference of type ‘List&’ from a temporary of type ‘List*’"
- "a list of vectors of ints" - 这可能吗?
- "use of class template requires template argument list"错误,即使使用了模板的模板,因此模板类是预期的
- "use of class template requires template argument list"是什么意思?
- 零MQ的"expected ';' at the end of declaration list"错误