Как прямой ответ на прямой вопрос.По теме if constexpr
.Учтите это:
template <typename T, typename ... params >
inline bool match_monostate
(std::variant<params ...> & variant) noexcept
{
if constexpr (std::is_same_v<T, std::monostate>)
{
variant = std::monostate{} ;
// compiles only if called with variant
// whose one alternative is std::monostate
return true;
}
else {
return false;
}
}
В зависимости от результата bool выражения if constexpr
компилятор фактически создает две функции.Эта версия создается, когда if constexpr()
возвращает true:
template <typename T, typename ... params >
inline bool
match_monostate (std::variant<params ...> & variant) noexcept
{
variant = std::monostate{} ;
// compiles only if called with variant
// whose one alternative is std::monostate
return true;
}
Эта версия создается, когда if constexpr()
возвращает false:
template <typename T, typename ... params >
inline bool
match_monostate (std::variant<params ...> & variant) noexcept
{
return false;
}
Вторая версия может выдавать предупреждения о неиспользованном аргументе.Но (кажется) нет, если использовать последние версии clang / gcc / msvc.Для более старых компиляторов, как указано в old123987, можно добавить стандартный атрибут к сигнатуре.Вот так:
template <typename T, typename ... params >
inline bool
match_monostate ([[maybe_unused]] std::variant<params ...> & variant) ;
Это остановит выдачу предупреждения.