Explicit figure

How can I check if a particular type of typename T constructive from the arguments of typename ...Args in the way T{Args...} ? I know a line like std::is_constructible< T, Args... > from <type_traits> , but it works with parentheses, not curly braces. I do not have too much experience writing type traits, so I cannot provide an example. As a simplification, we can accept any reasonable statements, even if this leads to a not too significant loss of generality.

+1
source share
2 answers
 template<class T, typename... Args> decltype(void(T{std::declval<Args>()...}), std::true_type()) test(int); template<class T, typename... Args> std::false_type test(...); template<class T, typename... Args> struct is_braces_constructible : decltype(test<T, Args...>(0)) { }; 
+3
source

Solution for my SFINAE class:

 #include <type_traits> template< typename ...types > struct identity { }; template< typename ...types > struct void_t { using type = void; }; template< typename type, typename identity, typename = void > struct is_embraceable : std::false_type { }; template< typename type, typename ...arguments > struct is_embraceable< type, identity< arguments... >, void_t< decltype(type{std::declval< arguments >()...}) > > : std::true_type { }; template< typename type, typename ...arguments > constexpr bool is_embraceable_v = is_embraceable< type, identity< arguments... > >::value; 
0
source

Source: https://habr.com/ru/post/1257452/


All Articles