[英]Iterating variadic template types
我已经坚持了好一阵子了,但我的构想耗尽了,不胜感激!
为了简化,以下各节是示例代码。
假设以下内容:
class Base;
class DerivedA : public Base;
class DerivedB : public Base;
和这个:
class Manager {
public:
std::map<std::type_index, Base*> container;
template<typename ...T>
void remove() {
// Iterate through templates somehow and...
container.erase(typeid(T));
}
}
基本上,我使用std :: type_index作为键将派生类的唯一实例存储在容器中。 让我做类似的事情:
manager.remove<DerivedA>();
话虽如此,我希望能够做同样的事情,但是允许多个模板直接一次删除多个实例,例如:
manager.remove<DerivedA, DerivedB>()
我知道可以像这里描述的那样遍历可变参数模板,但是我不断遇到编译错误...
错误C2440:“正在初始化”:无法从“初始化列表”转换为“ std :: initializer_list”
错误C3535:无法从“初始化列表”中推断“自动”的类型
...当我尝试运行此代码时:
template<typename ...T>
void remove() {
// Iterate through templates somehow and...
auto list = {(container.erase(typeid(T)))... };
}
有任何想法吗? 非常感谢你。
我猜您只是遇到了MSVC错误。 编译错误:
错误C3535:无法从“初始化列表”中推断“自动”的类型
无效。 C ++ 11确实允许从braced-init-list推导auto
,只要所有类型都相同。 在您的情况下, std::map::erase
返回size_t
,因此应进行编译。 这是一个基本上包含您的代码的示例。
为了解决这个问题,您也许可以显式提供以下类型:
size_t dummy[] = {m.erase(typeid(T))...};
或者,以防万一有人不输入任何类型,请加零:
size_t dummy[] = {0u, m.erase(typeid(T))...};
这样,数组将始终至少包含一个元素。 Kerrek在他的评论中建议的更典型用法如下:
int dummy[] = {0, (void(m.erase(typeid(T)), 0)... };
无论将m.erase(...)
替换为m.erase(...)
表达式,该m.erase(...)
都将m.erase(...)
,因为(..., 0)
值为0
。 那里的void
是为了避免operator,
重载问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.