這是相當不錯的(不是我),比如如何ü可以擴展(或「爆炸」)的元組作爲參數傳遞給函數:「解壓」的std ::陣列<T,N>作爲參數傳遞給函數
template<int ...I> struct index_tuple_type {
template<int N> using append = index_tuple_type<I..., N>;
};
template<int N> struct make_index_impl {
using type = typename make_index_impl<N-1>::type::template append<N-1>;
};
template<> struct make_index_impl<0> { using type = index_tuple_type<>; };
template<int N> using index_tuple = typename make_index_impl<N>::type;
template <typename I, typename ...Args>
struct func_traits;
template <typename R, int ...I, typename ...Args>
struct func_traits<R, index_tuple_type<I...>, Args...> {
template <typename TT, typename FT>
static inline R call(TT &&t, FT &&f) {
return f(std::get<I>(std::forward<TT>(t))...);
}
};
template<
typename FT,
typename ...Args,
typename R = typename std::result_of<FT(Args&&...)>::type
>
inline R explode(std::tuple<Args...>& t, FT &&f) {
return func_traits<R, index_tuple<sizeof...(Args)>, Args...>
::call(t, std::forward<FT>(f));
}
那麼你可以用這個像這樣:
void test1(int i, char c) {
printf("%d %c\n", i, c);
}
int main() {
std::tuple<int, char> t1{57, 'a'};
explode(t1, test1);
}
我是隨便你怎麼可以做std::array
同樣的事情,因爲它很喜歡元組。 std::get<N>
與std::array
一起使用,所以我認爲這將很容易修改此解決方案。但是像這樣的東西是行不通的:
template<
typename FT,
typename Arg,
std::size_t I,
typename R = typename std::result_of<FT(Arg&&)>::type
>
inline R explode(std::array<Arg, I>& t, FT &&f) {
return func_traits<R, index_tuple<I>, Arg>::
call(t, std::forward<FT>(f));
}
void test2(int i1, int i2) {
printf("%d %d\n", i1, i2);
}
int main() {
std::array<int, int> t1{1, 2};
explode(t2, test1);
}
因爲部分std::result_of<FT(Arg&&)>::type
。參數類型Arg&&
是錯誤的,result_of
沒有字段type
。對於元組Args&&...
展開,但現在應該是「重複」I
次。有沒有辦法做到這一點使用result_of
所以返回的類型可以扣除?
此外,我想知道,有工具來「解壓」 tuple
和array
,纔有可能以「解壓」遞歸(可能使用enable_if
)像tuple<array<int, 2>, tuple<array<double,3>, ...
等結構?某種樹tuple
和array
是分支,其他類型是樹葉?
帶有作爲類型模板參數編碼的左值引用的'std :: forward'等於「no-op」。你可能打算把't'作爲它的論點。和順便說一句,使用[尾隨返回類型像這裏](http://coliru.stacked-crooked.com/a/5af1aac65ba014d9)而不是 – 2015-02-10 19:35:45
你有沒有考慮過,而不是考慮做一個函數,將數組轉換爲引用的元組? – Hurkyl 2015-02-10 19:42:04
@PiotrS。糾正了'前鋒',我的錯誤擴展宏是錯誤的。 @Hurkyl是的,我想過了,但是這不是一回事。 – 2015-02-10 19:49:13