Is there a c++ trait to find the most restricted type between two types in C++?

  • A+
Category:Languages

I would like a type trait common

so that

common<int,int>::type              -> int common<const int, int>::type       -> const int common<int, int &>::type           -> int common<int &, int &>::type         -> int & common<int &, int const &>::type   -> int const & 

that is the result type should be the more restricted of the two. Is there a trait in the C++11 std that can do this or do I have to roll my own?

My use case is that I have a something similar to

template <typename T0, typename T1> struct Foo {     BOOST_STATIC_ASSERT(     std::is_same     < typename std::decay<T0>::type     , typename std::decay<T1>::type     >::value    );     // I need to find T which is the most restrictive common    // type between T0 and T1    typedef typename common<T0,T1>::type T     T0 t0;    T1 t1;     T choose(bool c){        return c ? t0 : t1;    }  }  

 


I am afraid that you need to roll your own. You can warp your types in a std::tuple, then pass it to std::common_type, e.g.

#include <tuple> #include <type_traits>  template <class T1, class T2> struct common {     using type = typename std::tuple_element<0, typename std::common_type<std::tuple<T1>, std::tuple<T2>>::type>::type; };  template <class T> struct common<const T, T> {     using type = const T; };  template <class T> struct common<T, const T> {     using type = const T; };  template <class T> struct common<const T, const T> {     using type = const T; };  int main() {     static_assert(std::is_same<common<int, int>::type, int>::value, "");     static_assert(std::is_same<common<const int, int>::type, const int>::value, "");     static_assert(std::is_same<common<int, int &>::type, int>::value, "");     static_assert(std::is_same<common<int &, int &>::type, int &>::value, "");     static_assert(std::is_same<common<int &, int const &>::type, int const &>::value, "");     return 0; } 

But you have to create special cases for const.

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: