18 #ifndef TYPE_CONSTRUCTOR_HPP
19 #define TYPE_CONSTRUCTOR_HPP
23 #include <type_traits>
39 template<
class Tout,
template<
class>
class Toh,
template <
class,
class>
class Tcr,
class Tf,
class ...Tl>
43 "The float_traits of the current class is not a floating point type");
45 return new Tcr<Tf, Tout>();
47 else return __create<Tout, Toh, Tcr, Tl...>(tval);
49 template<
class Tout,
template<
class>
class Toh,
template <
class,
class>
class Tcr>
53 val.append(tval->
vname());
54 val.append(
" is not recognized as a valid input type for ");
55 val.append(
typeid(Tout).name());
56 err(val,
"typelist::__create",
"utils/type_constructor.hpp",
FATAL_ERROR);
59 template<
class Tout,
template<
class>
class Toh,
template<
class,
class>
class Tcr>
61 (*in)=
__create<Tout, Toh, Tcr, P...>(val);
65 template<
template<
class>
class U>
74 template<
class Tout,
class Tf,
class ...Tl>
81 else return __check<Tout, Tl...>(tval);
93 template<
template<
class>
class U>
160 template<
template<
class>
class Tin>
166 virtual std::shared_ptr<Tout>
create() = 0;
170 template<
class Tval,
class Tout>
175 return std::make_shared<Tin<Tval> >();
205 class =
typename std::enable_if<std::is_base_of<vartype, Tout>::value >::type>
208 std_type_list::create<Tout, _ttype, ttype>(&temp, tval);
213 template<
class Tl,
class Tout,
214 class =
typename std::enable_if<std::is_base_of<vartype, Tout>::value >::type,
215 class = typename std::enable_if<std::is_base_of<blacklist_checker, Tl>::value >::type>
216 static void
create(std::shared_ptr<Tout>* in, const vartype* tval){
220 val.append(tval->vname());
221 val.append(
" is blacklisted as an input type for ");
222 val.append(
typeid(Tout).name());
223 err(val,
"type_constructor::create",
"utils/type_constructor.hpp",
FATAL_ERROR);
225 std_type_list::create<Tout, _ttype, ttype>(&temp, tval);
226 (*in) = temp->create();
234 std::shared_ptr<Tout> rval;
239 template<
class Tl,
class Tout>
241 std::shared_ptr<Tout> rval;