簡體   English   中英

迭代可變參數模板類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM