質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

238閲覧

variant<A,B> から variant<A,B,C> に変換する方法

fana

総合スコア11954

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/11/08 03:04

タイトルの通りですが,
std::variant<A,B> 型のオブジェクトから,(取り得る型の種類がより多い) std::variant<A,B,C> 型のオブジェクトを作りたい時,どう書けば良いのでしょうか?

以下の例のようにすればできますが,なんかこう,もっと 簡単に(?)/サクッと(?) 書ける方法があったりしますでしょうか?

例:

C++

1//例えば,なんかこんなのがあって… 2struct A{}; 3struct B{}; 4std::variant<A,B> A_or_B(); 5 6//こんなのを書くときに… 7struct C{}; 8std::variant<A,B,C> A_or_B_or_C() 9{ 10 if( /*何か*/ ) 11 {//A_or_B() の結果をそのまま結果とするフローがあるとき,どう書けばよいか? 12 //とりあえずコレでできているけど,もっと簡単な(?) 方法ってありますか? 13 auto A_or_B_result = A_or_B(); 14 return std::visit( []( auto &x )->std::variant<A,B,C>{ return x; }, A_or_B_result ); 15 } 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問者が提示した方法が最も単純な方法だと思います。 直和型を持つほかの言語でそういった状況で一発で変換できるようなものがあるかおおざっぱに調べてみた感じでは無いのが普通のようなのでそういうものなんでしょう。

適当な関数として切り出しておけば変換が必要な箇所の見栄えは少しすっきりするかもしれません。

つまり

cpp

1#include <type_traits> 2#include <variant> 3 4template <class... R, class... I> 5auto extend(std::variant<I...> arg) 6 -> std::enable_if_t<(... || std::is_convertible<I, std::variant<R...>>::value), std::variant<R...>> { 7 return std::visit([](auto &x) -> std::variant<R...> { return x; }, arg); 8}

というようなものを用意しておけば変換自体は

cpp

1extend<A, B, C>(A_or_B_result);

と書けるのでスッキリして見えます。

投稿2024/11/08 13:20

SaitoAtsushi

総合スコア5675

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/11/11 01:52 編集

ご回答ありがとうございます. > 適当な関数 に関しては,文法難度的に現状ではすんなりと読み書きできる気がしませんので, まずは質問文に示したようなコードを各所に書いとくのでいいかな,と思いました. --- > || なのは何故なのでしょうか?( && ではなく)
SaitoAtsushi

2024/11/11 02:37

単に間違えてます。 && とすべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問