在std :: tuple中转换元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在std :: tuple中转换元素相关的知识,希望对你有一定的参考价值。
我有一个带字符串的std::tuple
,我想将该元组的元素转换为整数。那可能吗?
E.g:
std::tuple<std::string,std::string>("1","2") --> std::tuple<int,std::string>(1,"2")
答案
如果你想在运行时更改std::tuple容器的基础类型之一,那么不可能。如果您只想将其中一个值转换为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) << '
';
}
...将通过断言并打印我们期望的内容。
我会包含一个Coliru演示的链接,但是它的GCC会在扩展lambda时触发,而它的Clang不知道if constexpr
或类模板参数演绎是什么。嘿。
以上是关于在std :: tuple中转换元素的主要内容,如果未能解决你的问题,请参考以下文章
为啥在片段中从 char* 转换为 std::string 比转换为 const char* 更可取?