ソースを参照

Make pushing std::tuples easier

Ole Krüger 10 年 前
コミット
86b0b996da
共有1 個のファイルを変更した13 個の追加11 個の削除を含む
  1. 13 11
      lib/luwra/types.hpp

+ 13 - 11
lib/luwra/types.hpp

@@ -267,22 +267,24 @@ struct Value<Arbitrary> {
 
 namespace internal {
 	template <typename>
-	struct Stackpusher;
+	struct StackPusher;
 
 	template <size_t I>
-	struct Stackpusher<std::index_sequence<I>> {
-		template <typename T> static inline
-		int push(State* state, const T& package) {
-			return push(state, std::get<I>(package));
+	struct StackPusher<std::index_sequence<I>> {
+		template <typename... T> static inline
+		int push(State* state, const std::tuple<T...>& package) {
+			using R = typename std::tuple_element<I, std::tuple<T...>>::type;
+			return std::max(0, Value<R>::push(state, std::get<I>(package)));
 		}
 	};
 
 	template <size_t I, size_t... Is>
-	struct Stackpusher<std::index_sequence<I, Is...>> {
-		template <typename T> static inline
-		int push(State* state, const T& package) {
-			int r = push(state, std::get<I>(package));
-			return std::max(0, r) + Stackpusher<std::index_sequence<Is...>>::push(state, package);
+	struct StackPusher<std::index_sequence<I, Is...>> {
+		template <typename... T> static inline
+		int push(State* state, const std::tuple<T...>& package) {
+			return
+				StackPusher<std::index_sequence<I>>::push(state, package)
+				+ StackPusher<std::index_sequence<Is...>>::push(state, package);
 		}
 	};
 }
@@ -294,7 +296,7 @@ template <typename... A>
 struct Value<std::tuple<A...>> {
 	static inline
 	int push(State* state, const std::tuple<A...>& value) {
-		return internal::Stackpusher<std::make_index_sequence<sizeof...(A)>>::push(state, value);
+		return internal::StackPusher<std::make_index_sequence<sizeof...(A)>>::push(state, value);
 	}
 };