Sprout.Variant の覚書

ちょっとハマったことがあったので覚書

[比較]

Sprout.Variant で比較を行う場合、型が合っていないとエラーになります。

typedef sprout::variant<int, float> var_type;

static constexpr var_type x{10};

static_assert(x == 10, "");
static_assert(x != 0.0f, "");
// static_assert(x == 10u, "");    // 比較する型が違うのでエラー

Sprout.Weed で or 演算子を使用すると Sprout.Variant 型で返ってくるので、その際に比較する時は注意。

[Sprout.String の初期化]

さて、次のように Sprout.String を使用する場合に文字列リテラルで初期化しようとするとコンパイルエラーになります。

typedef sprout::string<16> string;
typedef sprout::variant<int, string> var_type;

static constexpr var_type x{ "homu" };

これも型が違っているためエラーになっています。
なので明示的に string 型にキャストする必要があります。

typedef sprout::string<16> string;
typedef sprout::variant<int, string> var_type;

// to_string で文字列を定義して、string で明示的にキャスト
static constexpr var_type x{ string(sprout::to_string("homu")) };

// こちらも比較する場合は型を合わせる必要がある
static_assert(x == string(sprout::to_string("homu")), "");

これでOK

[ソース]

#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION
#include <sprout/variant.hpp>
#include <sprout/string.hpp>
#include <sprout/string/alias.hpp>

int
main(){
    typedef sprout::string<16> string;
    typedef sprout::variant<int, float, string> var_type;
    
    static constexpr var_type x{10};
    static_assert(x == 10, "");
    static_assert(x != 0.0f, "");
//  static_assert(x == 10u, "");    // 比較する型が違うのでエラー

    static constexpr var_type x2{ string(sprout::to_string("homu")) };
    static_assert(x2 == string(sprout::to_string("homu")), "");
//  static_assert(x2 == "homu", "");

    return 0;
}

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)