C++ 17では、私はおもちゃVMを実装しています。私はVMのスタックの要素としてstd :: variant()を使用しています。私はつまり、オペランドの種類を表すスタック上に文字列をプッシュする必要があります。std :: variant複数の文字列型を格納して区別する
- 変数名
- 識別子
- 引用符で囲まれた文字列
オペランドのすべての3種類が可能タイプstd :: string_viewの。バリアントはそうのように定義されています。
std::variant<bool, int, double, std::string_view>;
文字列のビューの実際の型について判別するためには、このような何かを行うための正しい方法は何ですか?
enum StringKind { Symbol, String, Var };
using Stringy = std::tuple<StringKind, std::string_view>; // SV can be symbol, var, string
std::variant<bool, int, double, Stringy>;
または、バリアントで文字列kindを正しくエンコードすることは可能ですか?バリアントレベルでそれを行う利点の1つは、std :: variant :: index()を呼び出すことによって型を保持できることです。それ以外の場合は、.index()== 3、std :: get < 3>(var)をチェックしてから、その文字列、シンボル、またはvarがあるかどうかを調べる必要があります。