C++11:从模板函数构建std :: tuple

6
我可以帮助您进行翻译。以下是需要翻译的内容:

我有以下函数:

template<class T>
T Check(int index);

我该如何编写一个名为CheckTuple的函数,根据给定的元组类型,填充元组并调用Check函数?

例如:

CheckTuple< std::tuple<int, float, std::string> >()

将返回以下元组:
std::make_tuple( Check<int>(1), Check<float>(2), Check<std::string>(3) )

我看到的其他问题都是关于拆解给定元组,而不是通过这种方式构建一个元组。

你熟悉可变参数模板函数吗? - Drew Dormann
一个比特。我最近几天开始使用它们。 - Taylor
这里到底是什么问题? - tumdum
@TomaszKłak,我正在尝试学习如何使用可变参数模板函数。 - Taylor
2个回答

4
使用C++14的integer_sequence实现你所寻找的变得非常简单。如果没有可用的,这里是一个C++11实现,由Jonathan Wakely编写:链接
template<typename Tuple, int... I>
Tuple CallCheck(std::integer_sequence<int, I...>)
{
    return std::make_tuple(Check<typename std::tuple_element<I, Tuple>::type>(I)...);
}

template<typename Tuple>
Tuple CheckTuple()
{
    return CallCheck<Tuple>(std::make_integer_sequence<int, std::tuple_size<Tuple>::value>());
}

// Use it as 
auto tup = CheckTuple<std::tuple<int, float, std::string>>();

现场演示


2

这是我的工作测试实现。(也许有人有提高简洁性的想法。我能否以某种方式摆脱TupleInfo?)

#include <typeinfo>
#include <tuple>
#include <iostream>

template<class T>
T Check(int i) {
    std::cout << "getting a " << typeid(T).name() << " at position " << i << std::endl;
    return T();
}

template<typename Signature>
struct TupleInfo;

template<class T, class... Args>
struct TupleInfo< std::tuple<T, Args...> > {
    using Head = T;
    using Tail = std::tuple<Args...>;
};

template<int N, class Tuple>
struct TupleChecker {

    static Tuple CheckTuple() {
        auto t = std::make_tuple(Check<typename TupleInfo<Tuple>::Head>(N));
        return std::tuple_cat(t, TupleChecker<N+1, typename TupleInfo<Tuple>::Tail >::CheckTuple());
    }

};

template<int N>
struct TupleChecker<N, std::tuple<> > {

    static std::tuple<> CheckTuple() {
        return std::tuple<>();
    }

};

template<class Tuple>
Tuple CheckTuple() {
    return TupleChecker<1, Tuple>::CheckTuple();
}

int main() {

    std::tuple<> t0 = CheckTuple<std::tuple<> >();

    std::tuple<int> t1 = CheckTuple<std::tuple<int> >();

    std::tuple<int, float, std::string> t2 = CheckTuple<std::tuple<int, float, std::string> >();

    return 0;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接