Я пробовал сделать static_assert
для одного конструктора сразу в std::enable_if
, используя msvc.
#include <type_traits>
template <typename ... Ts>
struct typelist {};
struct nothing {};
template<bool Boolean>
constexpr bool throw_assert() {
static_assert(Boolean);
return Boolean;
}
template <typename T, typename ... Ts>
constexpr bool contains(typelist<Ts...> = {}) {
return (... || std::is_same_v<T, Ts>);
}
template <typename ... Ts>
struct SomeClass {
using type_list = typelist<Ts...>;
constexpr SomeClass(std::enable_if_t < throw_assert < contains<nothing>(type_list{}) > () > * = 0) noexcept {}
};
int main() {
SomeClass<int, nothing>* someClass = new SomeClass<int,nothing>();
delete someClass;
return 0;
}
Но компилятор ругается, что в throw_assert
подается не compile-time константа. (Если оставить только contains
, то все нормально). Неужели такой трюк не будет проходить?
PS: Пока писал вопрос. Оказывается такое не проходит и на clang тоже, но gcc нормально съедает. Где правильно поведение?
Кому интересен обход для MSVC (Работает только на 1916 и выше), на godbolt 1914 не хочет собираться):
#include <type_traits>
template <typename ... Ts>
struct typelist {};
struct nothing {};
template <typename Intergral>
inline constexpr bool throw_assert(Intergral = {}) {
static_assert(Intergral::value);
return Intergral::value;
}
template <typename T, typename ... Ts>
constexpr bool contains(typelist<Ts...> = {}) {
return (... || std::is_same_v<T, Ts>);
}
template <typename T, typename ... Ts>
inline constexpr decltype(auto) contains_integral(typelist<Ts...> = {}) {
return ::std::bool_constant<(... || ::std::is_same_v<T, Ts>)>{};
}
template <typename ... Ts>
struct SomeClass {
using type_list = typelist<Ts...>;
constexpr SomeClass(std::enable_if_t < throw_assert(contains_integral<nothing>(type_list{})) > * = 0) noexcept {}
};
int main() {
SomeClass<int, nothing>* someClass = new SomeClass<int,nothing>();
return 0;
}
PS: Правка для 1914:
...
template <typename = std::enable_if_t < throw_assert(contains_integral<nothing>(type_list{})) >>
constexpr SomeClass() noexcept {}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Меня интересует, как внутри организованы игры серии Worms
Всем приветВообщем задачка нужно сделать маску как на https://www