Skip to content

Commit 4335780

Browse files
committed
add intial variant_alternative implementation (#161 http://en.cppreference.com/w/cpp/utility/variant/variant_alternative)
1 parent ba3085a commit 4335780

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ out/%.o: test/t/%.cpp Makefile $(ALL_HEADERS)
9999
mkdir -p ./out
100100
$(CXX) -c -o $@ $< -Iinclude -isystem test/include $(FINAL_CXXFLAGS)
101101

102-
out/unit: out/unit.o out/binary_visitor_1.o out/binary_visitor_2.o out/binary_visitor_3.o out/binary_visitor_4.o out/binary_visitor_5.o out/binary_visitor_6.o out/issue21.o out/issue122.o out/mutating_visitor.o out/optional.o out/recursive_wrapper.o out/sizeof.o out/unary_visitor.o out/variant.o
102+
out/unit: out/unit.o out/binary_visitor_1.o out/binary_visitor_2.o out/binary_visitor_3.o out/binary_visitor_4.o out/binary_visitor_5.o out/binary_visitor_6.o out/issue21.o out/issue122.o out/mutating_visitor.o out/optional.o out/recursive_wrapper.o out/sizeof.o out/unary_visitor.o out/variant.o out/variant_alternative.o
103103
mkdir -p ./out
104104
$(CXX) -o $@ $^ $(LDFLAGS)
105105

include/mapbox/variant.hpp

+28-1
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ class variant
858858

859859
VARIANT_INLINE int which() const noexcept
860860
{
861-
return static_cast<int>(sizeof...(Types)-type_index - 1);
861+
return static_cast<int>(sizeof...(Types) - type_index - 1);
862862
}
863863

864864
template <typename T, typename std::enable_if<
@@ -1023,6 +1023,32 @@ ResultType const& get_unchecked(T const& var)
10231023
{
10241024
return var.template get_unchecked<ResultType>();
10251025
}
1026+
1027+
// variant_alternative
1028+
template <std::size_t Index, typename...Types>
1029+
struct variant_alternative {};
1030+
1031+
template <std::size_t Index, typename First, typename...Types>
1032+
struct variant_alternative<Index, First, Types...>
1033+
{
1034+
using type = typename std::conditional<(sizeof...(Types) == Index),
1035+
First,
1036+
typename variant_alternative<Index, Types...>::type>::type;
1037+
};
1038+
1039+
template <std::size_t Index>
1040+
struct variant_alternative<Index>
1041+
{
1042+
using type = void;
1043+
};
1044+
1045+
template <std::size_t Index, typename...Types>
1046+
struct variant_alternative<Index, variant<Types...>>
1047+
{
1048+
using type = typename variant_alternative< sizeof...(Types) - Index - 1, Types...>::type;
1049+
};
1050+
1051+
10261052
} // namespace util
10271053
} // namespace mapbox
10281054

@@ -1035,6 +1061,7 @@ struct hash< ::mapbox::util::variant<Types...>> {
10351061
return ::mapbox::util::apply_visitor(::mapbox::util::detail::hasher{}, v);
10361062
}
10371063
};
1064+
10381065
}
10391066

10401067
#endif // MAPBOX_UTIL_VARIANT_HPP

test/t/variant_alternative.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "catch.hpp"
2+
3+
#include <mapbox/variant.hpp>
4+
#include <mapbox/variant_io.hpp>
5+
6+
#include <string>
7+
#include <iostream>
8+
9+
TEST_CASE("variant alternative", "[types]")
10+
{
11+
using variant_type = mapbox::util::variant<int, double, std::string>;
12+
using type_0 = mapbox::util::variant_alternative<0, variant_type>::type;
13+
using type_1 = mapbox::util::variant_alternative<1, variant_type>::type;
14+
using type_2 = mapbox::util::variant_alternative<2, variant_type>::type;
15+
16+
std::cerr << typeid(type_0).name() << std::endl;
17+
std::cerr << typeid(type_1).name() << std::endl;
18+
std::cerr << typeid(type_2).name() << std::endl;
19+
constexpr bool check_0 = std::is_same<int, type_0>::value;
20+
constexpr bool check_1 = std::is_same<double, type_1>::value;
21+
constexpr bool check_2 = std::is_same<std::string, type_2>::value;
22+
CHECK(check_0);
23+
}

0 commit comments

Comments
 (0)