转换性元素::元素

Convert element in std::tuple

本文关键字:元素 转换      更新时间:2023-10-16

我有一个带有字符串的std::tuple,我想将元素的元素转换为整数。这可能吗?

例如:

std::tuple<std::string,std::string>("1","2") --> std::tuple<int,std::string>(1,"2")

如果要在运行时更改std :: tuple容器的基础类型之一,则 no >不可能。如果您只想将其中一个值转换为int,则应该定义另一个元组并使用STD :: Stoi函数:

std::tuple<std::string, std::string> t1("1", "2");
std::tuple<int, std::string> t2(std::stoi(std::get<0>(t1)), std::get<1>(t1));

或使用std :: make_tuple函数和 auto指定符,然后让编译器推断出类型:

auto t3 = std::make_tuple(std::stoi(std::get<0>(t1)), std::get<1>(t1));

这是一个通用解决方案:

template <std::size_t At, class NewType, class Tuple, std::size_t... Idx>
auto convertAt_impl(Tuple const &orig, std::index_sequence<Idx...>) {
    return std::tuple{
        [&] {
            if constexpr(Idx == At)
                return boost::lexical_cast<NewType>(std::get<Idx>(orig));
            else
                return std::get<Idx>(orig);
        }()...
    };
}
template <std::size_t At, class NewType, class... Ts>
auto convertAt(std::tuple<Ts...> const &orig) {
    return convertAt_impl<At, NewType>(orig, std::index_sequence_for<Ts...>{});
}

它利用boost::lexical_cast执行转换,但是您可以用所需的任何转换设施替换它。

可以像这样调用它:

int main() {
    std::tuple tup{"1", "2"};
    auto tup2 = convertAt<0, int>(tup);
    static_assert(std::is_same_v<decltype(tup2), std::tuple<int, char const *>>);
    std::cout << std::get<0>(tup2) << ' ' << std::get<1>(tup2) << 'n';
}

...它将通过主张并打印我们的期望。

我将包含指向Coliru演示的链接,但是它的海湾合作委员会在扩展lambda时会引起火灾,而其clang不知道if constexpr或类模板参数扣除是什么。嘿。