迭代可变模板类型
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: 'initializing':无法从'initializer-list'转换为'std::initializer_list'
错误C3535:无法从'initializer-list'中推断出'auto'的类型
…当我尝试运行这段代码时:
template<typename ...T>
void remove() {
// Iterate through templates somehow and...
auto list = {(container.erase(typeid(T)))... };
}
任何想法?非常感谢。
我猜你刚刚遇到了一个MSVC错误。编译错误:
错误C3535:无法从'initializer-list'中推断出'auto'的类型
不是有效的。c++ 11允许从带括号的初始化列表中演绎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(...)
,都可以工作,因为(..., 0)
的值是0
。void
是为了避免operator,
过载的问题。
相关文章:
- 如何在c++迭代器类型中包装std::chrono
- 定义模板参数的迭代器类型
- C++以迭代方式搜索混合类型地图
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 专门C++使用指针值类型的通用迭代器的模板函数?
- C++类字符串类型的迭代器
- 在迭代模板类型列表时无法停止递归
- 使用概念对具有特定值类型的任何容器进行 C++ 迭代
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- 迭代时将指向differents类型的指针保存在std::向量中
- 如何转换不同类型的迭代器
- 如何从迭代器中找到对的类型
- C++不兼容的迭代器类型
- 如何确定迭代器在 c++ 模板函数中指向的对象的类型?
- 迭代器的模板参数:函数在调用时推断类型?
- 如何推导 std::高级迭代器类型?
- 在 stl 容器包装器中定义迭代器类型
- 对矢量<类型*>迭代器感到困惑
- C++异构类型迭代器的迭代器
- 为什么c++标准需要std::分区来满足不同类型迭代器的不同复杂性