2017-12-26 28 views
-4

私はstd::tupleの文字列を持っています。そのタプルの要素をIntegerに変換したいと思います。それは可能ですか?std :: tupleの要素を変換する

例えば:

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

コードを記入してください。 –

+5

これは、単一の 'std :: string'を' int'に変換するのとは異なる問題になるのはなぜですか? –

答えて

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)); 
0

は、一般的なソリューションです。変換を実行するにはを使用しますが、必要な変換機能で置き換えることができます。

それはそうのように呼び出すことができます:アサートを渡し、我々が期待するものに印刷されます

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。

関連する問題