私はstd::tuple
の文字列を持っています。そのタプルの要素をIntegerに変換したいと思います。それは可能ですか?std :: tupleの要素を変換する
例えば:
std::tuple<std::string,std::string>("1","2") --> std::tuple<int,std::string>(1,"2")
私はstd::tuple
の文字列を持っています。そのタプルの要素をIntegerに変換したいと思います。それは可能ですか?std :: tupleの要素を変換する
例えば:
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
指定子を使用して、コンパイラが型を推測してみましょう:
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...>{});
}
それはを使用する:ここで
auto t3 = std::make_tuple(std::stoi(std::get<0>(t1)), std::get<1>(t1));
は、一般的なソリューションです。変換を実行するにはを使用しますが、必要な変換機能で置き換えることができます。
それはそうのように呼び出すことができます:アサートを渡し、我々が期待するものに印刷されます
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のデモへのリンクを含んでいますが、そのGCCはラムダをパック展開するときに発砲し、Clangはif constexpr
またはクラステンプレートの引数減算が何であるか分かりません。 Heh。
コードを記入してください。 –
これは、単一の 'std :: string'を' int'に変換するのとは異なる問題になるのはなぜですか? –