У меня есть класс с std::variant
. Этот тип std::variant
разрешен только для хранения определенного списка типов.
У меня есть функции шаблона, которые позволяют пользователю класса вставлять различные значения в std::unordered_map
, на карте хранятся значения этого варианта. I.e., пользователю разрешено вставлять значения только в том случае, если он указан в конкретном списке типов. Однако я не хочу, чтобы пользователь мог сам определять этот список типов.
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???*/>...>>
Чтобы было ясно, я бы предпочел не проверять каждый разрешенный тип вручную.