2014-01-02 2 views
1

Как я могу проверить, существует ли конкретный тип typename T из аргументов typename ...Args в порядке T{Args...}? Я знаю std::is_constructible< T, Args... > тип от <type_traits>, но он работает с круглыми скобками, а не фигурными фигурными скобками. У меня нет слишком большого опыта написания черт типа, поэтому я не могу представить пример. В качестве упрощения мы можем принять любые разумные утверждения, даже если это приводит к не слишком значительной потере общности.Is-braces-constructable type trait

+0

@ Крис, но как насчет 'STRUCT A {станд :: установить < int > а; int b; }; using variant_type = boost :: variant ; 'variant type? 'std :: initializer_list {std :: decltype >(), int()}' не имеет смысла. – Orient

+0

std :: is_constructable > если все аргументы одного типа .... – IdeaHat

ответ

3
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)) 
{ 
}; 
+0

Может ли это выражаться в терминах structs/classes, а не в терминах возвращаемых значений функций? – Orient

0

Мой класс-SFINAE-решение:

#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; 
Смежные вопросы