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