support for GCC4.7: optional in-place constructor

This commit is contained in:
bolero-MURAKAMI 2013-07-01 16:57:56 +09:00
parent 05a1ebfa85
commit 9ca88083ac
2 changed files with 16 additions and 6 deletions

View file

@ -42,6 +42,11 @@ namespace sprout {
typedef typename holder_type::reference_const_type reference_const_type;
typedef typename holder_type::pointer_type pointer_type;
typedef typename holder_type::pointer_const_type pointer_const_type;
public:
template<typename... Args>
struct is_constructible_args
: public std::is_constructible<T, Args&&...>
{};
public:
static SPROUT_CONSTEXPR reference_type get(optional& t) SPROUT_NOEXCEPT {
return sprout::get(t.val);
@ -108,7 +113,7 @@ namespace sprout {
{}
template<
typename... Args,
typename = typename std::enable_if<std::is_constructible<T, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<Args...>::value>::type
>
explicit SPROUT_CONSTEXPR optional(sprout::in_place_t, Args&&... args)
: init(true)
@ -116,7 +121,7 @@ namespace sprout {
{}
template<
typename U, typename... Args,
typename = typename std::enable_if<std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<std::initializer_list<U>&, Args...>::value>::type
>
explicit SPROUT_CONSTEXPR optional(sprout::in_place_t, std::initializer_list<U> il, Args&&... args)
: init(true)
@ -177,7 +182,7 @@ namespace sprout {
template<
typename... Args,
typename = typename std::enable_if<std::is_constructible<T, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<Args...>::value>::type
>
void emplace(Args&&... args) {
optional temp(sprout::in_place, sprout::forward<Args>(args)...);
@ -185,7 +190,7 @@ namespace sprout {
}
template<
typename U, typename... Args,
typename = typename std::enable_if<std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<std::initializer_list<U>&, Args...>::value>::type
>
void emplace(std::initializer_list<U> il, Args&&... args) {
optional temp(sprout::in_place, il, sprout::forward<Args>(args)...);

View file

@ -174,6 +174,11 @@ namespace sprout {
typedef mutable_or_const_pointer pointer_const_type;
typedef param_type argument_type;
typedef movable_param_type movable_argument_type;
public:
template<typename... Args>
struct is_constructible_args
: public std::is_constructible<T, Args&&...>
{};
public:
static SPROUT_CONSTEXPR reference get(value_holder& t) SPROUT_NOEXCEPT {
return helper_type::ref(t.holder_);
@ -209,14 +214,14 @@ namespace sprout {
{}
template<
typename... Args,
typename = typename std::enable_if<std::is_constructible<T, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<Args...>::value>::type
>
explicit SPROUT_CONSTEXPR value_holder(sprout::in_place_t, Args&&... args)
: holder_(sprout::forward<Args>(args)...)
{}
template<
typename U, typename... Args,
typename = typename std::enable_if<std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value>::type
typename = typename std::enable_if<is_constructible_args<std::initializer_list<U>&, Args...>::value>::type
>
explicit SPROUT_CONSTEXPR value_holder(sprout::in_place_t, std::initializer_list<U> il, Args&&... args)
: holder_(il, sprout::forward<Args>(args)...)