首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填写std::tuple

填写std::tuple
EN

Stack Overflow用户
提问于 2013-12-28 16:28:51
回答 2查看 1.1K关注 0票数 2

我有一个重载函数,它看起来像:

代码语言:javascript
复制
template<typename T>
T getColumn(size_t i);

template<>
std::string getColumn<std::string>(size_t i) {
    if(i == 0)
        return "first";
    else
        return "other";
}

template<>
int getColumn<int>(size_t i) {
    return i*10;
}

// ...

现在我想实现这个函数

代码语言:javascript
复制
template<typename... Values>
std::tuple<Values...> getColumns();

它创建一个元组(用于返回值),并为元组的每个元素调用getColumn (在该元素中保存返回值),其中i是元素的位置。生成getColumn返回值的代码是简化的(实际上它从数据库中获取值)。

但我不知道该怎么做。

我最大的努力是使用boost::fusion::for_each,但我无法将i交给getColumn

另一次尝试是使用boost::融合的迭代器,但这也不起作用:

代码语言:javascript
复制
namespace fusion = boost::fusion;
tuple<Values...> t;
auto it = fusion::begin(t);
while(it != fusion::end(t)) {
    getColumn(distance(fusion::begin(t), it), fusion::deref(it));
    it = fusion::next(it); // error: assignment not allowed
}

如何用正确的值为getColumn调用Values...中的每个类型的i,并将结果保存在std::tuple

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-28 17:02:07

您需要将参数包的每个元素映射到其包中的索引--这是“索引序列技巧”的典型用例:

代码语言:javascript
复制
template <int... I> struct index_sequence {};
template <int N, int... I>
struct make_index_sequence : make_index_sequence<N-1,N-1,I...> {};
template <int... I>
struct make_index_sequence<0, I...> : index_sequence<I...> {};

template<typename... Values, int... I>
auto getColumns(index_sequence<I...>) ->
  decltype(std::make_tuple(getColumn<Values>(I)...)) {
    return std::make_tuple(getColumn<Values>(I)...);
}

template<typename... Values>
auto getColumns() ->
  decltype(getColumns<Values...>(make_index_sequence<sizeof...(Values)>())) {
    return getColumns<Values...>(make_index_sequence<sizeof...(Values)>());
}

在Coliru现场演示。

票数 3
EN

Stack Overflow用户

发布于 2013-12-28 16:32:08

也许是用auto

代码语言:javascript
复制
template<typename... Values>
auto getColumns() -> decltype(std::make_tuple(getColumns<Values>()...))
{
    return std::make_tuple(getColumns<Values>()...);
}

在C++14中,您可以省略-> decltype...部分,因为它将从函数体中推导出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20816745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档