【发布时间】:2015-07-13 02:22:51
【问题描述】:
我已经被困了一段时间了,我的想法已经用完了,感谢您的帮助!
为简化起见,以下部分是示例代码。
假设如下:
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>()
我知道可以按照here 的描述遍历可变参数模板,但我不断收到编译错误...
错误 C2440:“正在初始化”:无法从“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)))... };
}
有什么想法吗? 非常感谢。
【问题讨论】:
-
int dummy[] = { (c.erase(typeid(T)), 0)... }; -
哇,您的解决方案开箱即用,效果非常好……我之前尝试过类似的方法,但没有 0。有什么区别?
-
您的代码应该没问题,可能是 MSVC 错误(
erase返回size_t,所以应该没问题)。它应该只是将list推断为std::initialize_list<size_t>...
标签: c++ templates variadic-templates initializer-list multiple-arguments