gpt4 book ai didi

c++ - std::tuple 获取除最后一个元素之外的所有内容

转载 作者:行者123 更新时间:2023-11-30 02:18:49 25 4
gpt4 key购买 nike

我正在尝试返回 std::tuple 中除最后一个元素之外的所有内容,如果元组中只有两个元素,则返回第一个。由于 std::tuple 有很多编译时工具,双返回类型应该是可行的。这是我到目前为止所拥有的:

// Behavior
// init(std::make_tuple(1,2)) = 1
// init(std::make_tuple(1,2,3)) = (1,2)

// First case
template<class T1, class T2>
inline static T1 init(Tuple<T1, T2> t) {
return std::get<0>(t);
}

// Second case
template<class ...Args, class S = std::make_index_sequence<sizeof...(Args) - 1>>
inline static decltype(auto) init(Tuple<Args...> t) {
return std::apply([](const auto &item...) {
return std::tuple_cat(std::make_tuple(std::get<S>) ... std::tuple<>);
}, t);
}

如果我能以 C++17 友好的方式做到这一点,那就太好了。我在上面的实现中遇到了以下错误:

./tuple.cpp:36:55: error: pack expansion does not contain any unexpanded parameter packs
return std::tuple_cat(std::make_tuple(std::get) ... std::tuple<>);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.

最佳答案

与您的问题无关,但模板暗示 inline 而您不想要 static。我实际上认为 static 违反了 ODR。你为什么使用它们?您也可以创建函数 constexpr。进一步的改进是使用(转发)引用和 std::forward_as_tuple。这是一个基本的实现:

template <class... Args, std::size_t... Is>
constexpr auto init_helper(std::tuple<Args...> tp, std::index_sequence<Is...>)
{
return std::tuple{std::get<Is>(tp)...};
}

template <class... Args>
constexpr auto init(std::tuple<Args...> tp)
{
return init_helper(tp, std::make_index_sequence<sizeof...(Args) - 1>{});
}
auto test()
{
static_assert(init(std::tuple{1}) == std::tuple{});
static_assert(init(std::tuple{1, 2}) == std::tuple{1});
static_assert(init(std::tuple{1, 2, 3}) == std::tuple{1, 2});
}

你在评论中说你想看看 init(std::tuple{1,2}) 是否有可能直接返回值而不是一个值的元组。请注意,我不推荐这样做,因为它会使函数行为不一致,是的,这是可能的。 C++17 使它变得非常干净:

template <class... Args>
constexpr auto init(std::tuple<Args...> tp)
{
if constexpr (sizeof...(Args) == 2)
return std::get<0>(tp);
else
return init_helper(tp, std::make_index_sequence<sizeof...(Args) - 1>{});
}

auto test()
{
static_assert(init(std::tuple{1}) == std::tuple{});
static_assert(init(std::tuple{1, 2}) == 1);
static_assert(init(std::tuple{1, 2, 3}) == std::tuple{1, 2});
}

关于c++ - std::tuple 获取除最后一个元素之外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com