参数包扩展不起作用
Parameter pack expansion doesn't work
我试图制作 std::set
的多路复用,命名为 NDos::set_multiplex
,它可以从各种比较对象的角度查看元素。例如,一组扑克牌可以先排名第一和西装第二,或者首先排名第二。NDos::set_multiplex
使得可以方便地执行此操作。 NDos::set_multiplex
通过继承多个std::set
s,一个存储元素,而其他将迭代器存储到元素上的方法来做到这一点。 NDos::IterComp
是一种Callable
类型,比较了两个迭代器所指的元素。
这是代码:
/*...*/
namespace NDos {
template <class T, class Comp0, class... Comps> class set_multiplex :
private std::set<T, Comp0>,
private std::set<
typename std::set<T, Comp0>::iterator,
IterComp<typename std::set<T, Comp0>::iterator, Comps>
>... {
private:
typedef std::set<T, Comp0> Base0;
public:
/*...*/
using typename Base0::iterator;
using typename Base0::const_iterator;
using typename Base0::reverse_iterator;
using typename Base0::const_reverse_iterator;
#define Bases std::set<iterator, IterComp<iterator, Comps>>
/*constructors*/
// copy constructor : default
// move constructor : default
// copy assignment operator : default
// move assignment operator : default
// destructor : default
/*...*/
void clear() noexcept {
Base0::clear();
Bases::clear()...;
}
iterator insert(const T &value) {
return emplace(value);
}
iterator insert(T &&value) {
return emplace(std::move(value));
}
iterator insert(const_iterator pos, const T &value) {
return emplace_hint(pos, value);
}
iterator insert(const_iterator pos, T &&value) {
return emplace_hint(pos, std::move(value));
}
template <class InputIt> void insert(InputIt first, InputIt last) {
while (first != last)
insert(*first++);
}
void insert(std::initializer_list<T> ilist) {
insert(std::make_move_iterator(ilist.begin()), std::make_move_iterator(ilist.end()));
}
template <class... Args> iterator emplace(Args &&...args) {
iterator i0 = Base0::emplace(std::forward<Args>(args)...).first;
Bases::insert(i0)...;
return i0;
}
template <class... Args> iterator emplace_hint(const_iterator pos, Args &&...args) {
iterator i0 = Base0::emplace_hint(pos, std::forward<Args>(args)...).first;
Bases::insert(i0)...;
return i0;
}
iterator erase(iterator pos) {
Bases::erase(pos)...;
return Base0::erase(pos);
}
iterator erase(const_iterator first, const_iterator last) {
while (first != last)
erase(first++);
}
size_type erase(const T &key) {
iterator pos = find(key);
if (pos == end())
return 0;
else {
erase(pos);
return 1;
}
}
void swap(set_multiplex &other) noexcept {
Base0::swap(other);
Bases::swap(other)...;
}
/*...*/
#undef Bases
};
}
参数包未正确扩展。G 6.2报告每个扩展的错误:(在功能clear
,emplace
,emplace_hint
,erase
和swap
)
error: expected ';' before '...' token
error: parameter packs not expanded with '...'
为什么会发生这些?
在C 11中,您不能简单地执行此操作:
Bases::clear()...;
在您以这种方式使用...
的所有其他地方也会发生同样的情况:
Bases::insert(i0)...;
Bases::erase(pos)...;
Bases::swap(other)...;
尝试使用这样的东西:
void clear() noexcept {
Base0::clear();
int _[] = { 0, (Bases::clear(), 0)... };
(void)_; // silent warnings, nothing more
}
这是在等待C 17及其折叠表达式时使用的常见技巧。
swap
功能的特殊提及:如果您将other
与Base0
交换,则理论上other
将在交换后包含Base0
中的数据。再次将其用于另一个交换似乎不是一个好主意。
也许您应该查看swap
功能的实现。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 文件写入在PHP扩展c / c ++(linux)中不起作用
- Microsoft具有本机消息传递和非持久连接的边缘扩展不起作用
- 参数包扩展不起作用
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- QML 简单扩展不起作用
- 基于文件扩展名的筛选在QFileSystemModel中不起作用
- 内联扩展可能不起作用的情况
- ContextMenu项扩展在Windows 7中不起作用
- 正则表达式替换文件扩展名前缀放置不起作用 - 替换匹配项
- 带有 boost 的 Python 的 C++ 扩展不起作用
- Firefox XPCOM 扩展在安装后不起作用 (C++)
- Rename()函数在尝试向文件添加扩展名时不起作用