推送和弹出std :: tuple的第一个元素

时间:2016-08-23 12:38:30

标签: c++ c++11 variadic-templates variadic-functions

我正在用这种方式在C ++中编写一个带有可变数量的参数(和不同类型)的函数

Map

我想做什么,但我不知道如何推动和弹出元组中的元素,特别是第一个元素...类似

template<typename ...Ts>
void myFunction(Ts ...args)
{
    //create std::tuple to access and manipulate single elements of the pack
    auto myTuple = std::make_tuple(args...);    

    //do stuff

    return;
}

这可能吗?

4 个答案:

答案 0 :(得分:7)

您可以执行类似

的操作
template <typename T, typename Tuple>
auto push_front(const T& t, const Tuple& tuple)
{
    return std::tuple_cat(std::make_tuple(t), tuple);
}

template <typename Tuple, std::size_t ... Is>
auto pop_front_impl(const Tuple& tuple, std::index_sequence<Is...>)
{
    return std::make_tuple(std::get<1 + Is>(tuple)...);
}

template <typename Tuple>
auto pop_front(const Tuple& tuple)
{
    return pop_front_impl(tuple,
                          std::make_index_sequence<std::tuple_size<Tuple>::value - 1>());
}

Demo

请注意,它是非常基本的,不会处理引用元组或const限定类型的元组,但它可能就足够了。

答案 1 :(得分:0)

std::tuple的长度和类型在编译时确定。没有运行时弹出或推送是可能的。您可以使用std::vector来提供运行时修改。

矢量的数据类型可以是std::variant(C ++ 17)或boost::variant。两种类型在编译时都会获得受支持类型的列表,并且可以使用任何匹配类型的值填充。

或者,您可以使用std::any(也是C ++ 17)或boost::any来存储任何类型,但具有不同的访问语义。

typedef boost::variant<int, std::string, double> value;
std::vector<value> data;
data.push_back(value(42));
data.psuh_back(value(3.14));

答案 2 :(得分:0)

使用通用lambda,你可以做得很优雅:

NULL

答案 3 :(得分:-1)

你不能通过添加元素来“延长”元组 - 这不是元组所代表的。元组的要点是构成它的不同值之间的绑定连接,如'firstname','lastname','phone'。

使用矢量可以更轻松地完成您想要的任务 - 您可以轻松地向其中添加元素并删除它们 - 其大小可以根据需要随意更改。