Я объявил boost::variant, который принимает три типа: 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
type: string → some string
Если я удалю тип bool из MyVariant и измените его на это:
typedef variant<string, int> MyVariant;
const char* больше не преобразуется в bool. На этот раз он преобразуется в string, и это новый вывод:
type: string → некоторая строка
type: string → some string
Это означает, что variant пытается сначала преобразовать другие типы в bool, а затем в string. Если преобразование типа является чем-то неизбежным и должно всегда происходить, есть ли способ дать преобразование в string более высокий приоритет?