、、およびboost::variant
の3つのタイプを受け入れるを宣言しました。次のコードは、私のバリアントがそれを受け入れてに変換することを示しています。リストにないタイプを受け入れて変換するのは正常な動作ですか?string
bool
int
const char*
bool
boost::variant
#include <iostream>
#include "boost/variant/variant.hpp"
#include "boost/variant/apply_visitor.hpp"
using namespace std;
using namespace boost;
typedef variant<string, bool, int> MyVariant;
class TestVariant
: public boost::static_visitor<>
{
public:
void operator()(string &v) const
{
cout << "type: string -> " << v << endl;
}
template<typename U>
void operator()(U &v)const
{
cout << "type: other -> " << v << endl;
}
};
int main(int argc, char **argv)
{
MyVariant s1 = "some string";
apply_visitor(TestVariant(), s1);
MyVariant s2 = string("some string");
apply_visitor(TestVariant(), s2);
return 0;
}
出力:
タイプ:その他-> 1
タイプ:文字列->いくつかの文字列
MyVariantからbool型を削除して、次のように変更すると、次のようになります。
typedef variant<string, int> MyVariant;
const char*
に変換されなくなりましたbool
。今回はに変換されstring
、これが新しい出力です。
タイプ:文字列->いくつかの文字列
タイプ:文字列->いくつかの文字列
これは、variant
他のタイプを最初にに変換しbool
、次にに変換しようとすることを示していstring
ます。型変換が避けられないものであり、常に発生する必要がある場合、変換をstring
より高い優先度にする方法はありますか?