私はstring
,bool
およびint
の3種類を受け入れるboost::variant
と宣言しました。次のコードは、私のバリアントがconst char*
を受け入れ、bool
に変換していることを示しています。 boost::variant
がリストにない型を受け入れて変換するのは正常な動作ですか?boost :: variant - "const char *"が "bool"に変換されるのはなぜですか?
#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
に与える方法はありますか?
説明を完了するには:ポインタ型から 'bool'への暗黙的な変換があり、組み込みの暗黙の変換は常にユーザー定義の変換より優先して選択されます。 ( 'char *'から 'std :: string'への変換はユーザ定義としてカウントされます。)コンストラクタの変更に関しては、クラスを別のクラスにラップするか、そこから派生させることができます。文脈によっては、これらの1つが適切かもしれません。どちらにもいくつかの欠点があります。 –
私は1つの解決策は、 'MyVariant'から' bool'を削除し、代わりに0と1の値を使うことだと思います。 – Meysam
@マイザム:はい。私はそれを推薦することを考えましたが、おそらく、 'MyVariant'を' false'で初期化した 'MyVariant'と違うように' 0'で初期化したかったと思いました。それらが同じであればOKですが、 'bool'を削除してください。彼らの意味が異なる場合、それほど単純ではありません。 –