[英]Converting std::array of std::string to std::tuple of the same size using boost::lexical_cast
我想创建一个接受字符串数组并将其转换为元组的函数,方法是对每个数组元素进行lexical_cast。
std :: array的大小与std :: tuple的大小相同,并且所有元组类型在编译时都是已知的
例如:
std::tuple<int, double> Result = Convert({"1", "1.0"});
要么
int A, B;
std::tie(A, B) = Convert({"1", "2"});
如何在可接受的性能和没有c ++ 14支持的情况下做到这一点?
你可以做
namespace detail
{
template <typename ... Ts, std::size_t N, std::size_t...Is>
std::tuple<Ts...>
Convert(const std::array<std::string, N>& s,
std::index_sequence<Is...>)
{
return std::tuple<Ts...>{boost::lexical_cast<Ts>(s[Is])...};
}
}
template <typename ... Ts, std::size_t N>
std::tuple<Ts...> Convert(const std::array<std::string, N>& s)
{
static_assert(N == sizeof...(Ts), "Unexpected size");
return detail::Convert<Ts...>(s, std::index_sequence_for<Ts...>());
}
用法:
std::array<std::string, 2u> ns = {"1", "4.2"};
auto t = Convert<int, double>(ns);
您必须提供要转换为的类型。 如:
std::tuple<int, double> Result = Convert<int, double>({"1", "1.0"});
这样,还不错:
template <typename... Ts>
std::tuple<Ts...> Convert(const std::array<std::string, sizeof... (Ts)>& arr ) {
return Convert<Ts...>(arr, make_index_sequence<sizeof...(Ts)>{} );
}
template <typename... Ts, typename... Is>
std::tuple<Ts...> Convert(const std::array<std::string, sizeof... (Ts)>& arr, index_sequence<Is...> ) {
return std::make_tuple(boost::lexical_cast<Ts>(arr[Is])...));
}
在SO上有几种C ++ 11的索引序列技巧的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.