我有一個其中包含std::variant
的類。這個std::variant
類型只允許保存特定的類型列表。如何檢查std :: variant是否可以保存某種類型
我有模板功能,允許類的用戶插入各種值到std::unordered_map
,地圖保存這種變體類型的值。即,如果用戶的類型在特定的類型列表中,則只允許插入值。但是,我不希望用戶能夠自己定義這個類型的列表。
class GLCapabilities
{
public:
using VariantType = std::variant<GLint64>; // in future this would have other types
template <typename T>
std::enable_if_t<???> AddCapability(const GLenum parameterName)
{
if(m_capabilities.count(parameterName) == 0)
{
/*... get correct value of type T ... */
m_capabilities.insert(parameterName,value);
}
}
template<typename T>
std::enable_if_t<???,T> GetCapability(const GLenum parameterName) const
{
auto itr = m_capabilities.find(parameterName);
if(std::holds_alternative<T>(*itr))
return std::get<T>(*itr);
return T;
}
private:
std::unordered_map<GLenum,VariantType> m_capabilities;
};
你會在上面看到有???
,我該怎麼檢查? std::disjunction
和std::is_same
的組合?
像
std::enable_if<std::disjunction<std::is_same<T,/*Variant Types???*/>...>>
要清楚,我寧願不用手動檢查對每個允許的類型。
不會'm_capabilities.insert('簡單地編譯失敗是一個無效的值被傳遞了嗎?在我看來,簡單的鴨子打字就是這裏的簡單答案,如果你使用'emplace )',顯然,還是你想防止任何隱式轉換? – Frank
因爲我會使用各種OpenGL類型,比如'GLuint'或者'GLint'等,隱式轉換可能是一個問題;所以是的,我會就像避免它一樣 – NeomerArcana
在Boost.Variant中我們有'VariantType :: types'來獲得一個'mpl :: list'類型,然後你可以使用'mpl :: contains'。這似乎在'std: :variant',必須通過推導模板參數並使用可變參數模板來實現它。 – alfC