【发布时间】:2016-05-15 18:45:08
【问题描述】:
给定一个参数包和一个字符串向量,我想递归地构建一个元组,它一次取每个元组中的第一个,并将其附加到元组中。因此,如果我有一个带有“string1”、“string2”、“string3”的向量和一个参数包 5、2.5、true... 生成的元组将是“string1”、5、“string2”、2.5、“string3 ",是的。
这是我目前尝试过的
我主要做这样的事情
std::vector<std::string> string_vec;
std::tuple<> t;
//initalize string_vec to something
set_up_strings(string_vec);
//pass an empty tuple to start building with the strings and args
tuple_maker(t, string_vec, args...);
我的 tuple_maker 递归地添加一个。
template<typename T, typename... Args, typename... Ts>
void tuple_maker(std::tuple<Ts...> t, std::vector<std::string> &vec, T value, Args... args)
{
auto newTup1 = tuple_append(t, vec.begin());
auto newtup2 = tuple_append(newTup1, value);
vec.erase(vec.begin());
//now pass in the vector and args after removing front of each
tuple_maker(newtup2, vec,args...);
}
最终当没有更多参数时,将调用此函数(结束递归)
template<typename... Ts>
std::tuple<Ts...> tuple_maker(std::tuple<Ts...> t, std::vector<std::string> &vec)
{
int tup_size = std::tuple_size<decltype(t)>::value;
std::cout<< "final tuple has size of " << tup_size << std::endl;
//return t;
}
如果我像之前提到的那样传入 string1-3 和 3 个参数,它会打印大小为 6 的元组,所以我相信它正在正确创建它。但是,我无法将其返回主函数。我不知道如何设置返回类型,以便正确地将最终元组带回上一个函数,然后返回主函数。
供参考,我使用的辅助'tuple_maker'函数在这里
template <typename NewType, typename... TupleElem>
std::tuple<TupleElem..., NewType> tuple_append(const std::tuple<TupleElem...> &tup, const NewType &n)
{
return std::tuple_cat(tup, std::make_tuple(n));
}
我尝试过这样的事情......
template<typename T, typename... Args, typename... Ts, typename... ret>
std::tuple<ret...> tuple_maker(std::tuple<Ts...> t, std::vector<std::string> &vec, T value, Args... args)
【问题讨论】:
-
如果您使用的是 c++14,那么
auto就足够了...如果不是,您可以尝试将auto与-> decltype()结合起来,在 decltype 的括号中您应该通过调用生成元组的函数... -
你可以让函数返回类型为 auto 吗?编辑我一直在使用 c++11 但我会尝试 14
-
是的,它应该被接受,因为编译器可以从返回语句中推断出结果...
标签: c++ templates recursion tuples variadic-templates