mirror of https://github.com/CGAL/cgal
make Kernel_traits<T>::type::FT usable as return type of free function
in a free function that has such a return type, if there are several overloads the return type of each should be instanciable. This fix will make incorrect usages break later while enabling the use in free function.
This commit is contained in:
parent
ef2cef3eb4
commit
3346aed52b
|
|
@ -25,12 +25,40 @@
|
|||
#ifndef CGAL_KERNEL_TRAITS_H
|
||||
#define CGAL_KERNEL_TRAITS_H
|
||||
|
||||
#include <boost/mpl/has_xxx.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
namespace internal_kernel_traits{
|
||||
BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_nested_R,R,false)
|
||||
|
||||
/// In case no specialization of CGAL::Kernel_traits is provided and the type used
|
||||
/// is not coming from a CGAL Kernel, we provide a dummy Kernel just to break later
|
||||
/// and only when it is used. This was introduced to avoid issues with a free function
|
||||
/// return a nested type of the kernel through Kernel_traits. Even if the function
|
||||
/// was not the one to consider, its return type should be instanciable.
|
||||
template <class T>
|
||||
struct Dummy_kernel
|
||||
{
|
||||
struct FT{};
|
||||
};
|
||||
|
||||
template <class T, bool is_cgal_kernel = Has_nested_R<T>::value >
|
||||
struct Kernel_traits{
|
||||
typedef typename T::R type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct Kernel_traits<T, false>{
|
||||
typedef Dummy_kernel<T> type;
|
||||
};
|
||||
} // end of namespace internal_kernel_traits
|
||||
|
||||
template <class T>
|
||||
struct Kernel_traits
|
||||
{
|
||||
typedef typename T::R Kernel;
|
||||
typedef typename internal_kernel_traits::Kernel_traits<T>::type Kernel;
|
||||
typedef Kernel type;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue