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:
Sébastien Loriot 2015-03-17 16:17:49 +01:00
parent ef2cef3eb4
commit 3346aed52b
1 changed files with 29 additions and 1 deletions

View File

@ -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;
};