How to check if all variational arguments of a template have a special function?

Explanation:

Checking for the presence of a special parameter in the template is easy (using this).

The following code checks if char operator[] exists in Type or not:

 template <class Type> class HasStringOperator { template <typename T, T> struct TypeCheck; typedef char Yes; typedef long No; template <typename T> struct operator_{ typedef char (T::*fptr)(int); }; template <typename T> static Yes HasOperator(TypeCheck< typename operator_<T>::fptr, &T::operator[] >*); template <typename T> static No HasOperator(...); public: static bool const value = (sizeof(HasOperator<Type>(0)) == sizeof(Yes)); }; 

ideone

Problem:

Now I want to check if all my variational pattern parameters have this operator. I cannot figure out how to send them one by one to HasStringOperator and check the whole result.

 template < class... Word> class Sentence { static_assert(Do all of Words have 'char operator[]'?); }; 

What should I do?

+8
c ++ function c ++ 11 templates variadic-templates
source share
2 answers

Just apply it to each type and compare it to a true s array.

 template <bool... b> struct BoolArray {}; template <class... TS> struct DenyType : true_type {}; template <class... World> class Sentence { static_assert(is_same< BoolArray<(HasStringOperator<World>::value)...>, BoolArray<(DenyType<World>::value)...> >::value, "WUT"); }; 
+6
source share

I want to simplify @ polkovnikov.ph answer:

 template< bool ... b> struct BoolArray{}; template< bool ... b> struct ctx_all_of: std::is_same< BoolArray<b...>, BoolArray<(b,true)...> >{}; template< class... World> struct Sentence: ctx_all_of< HasStringOperator<World>::value ... >{}; 
+4
source share

All Articles