迭代可变参数模板类型

睿慈善

我已经坚持了好一阵子,但我的想法不多了,请帮忙!

为了简化,以下各段是示例代码。

假设以下内容:

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允许autobraced-init-list进行推导在您的情况下,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)is的值0void目的是避免问题超载operator,

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章