Üç tür kabul eden boost::variant
bildirdim: string
, bool
ve int
. Aşağıdaki kod benim varyantımın const char*
kabul ettiğini ve bool
'a dönüştürdüğünü gösteriyor. Listesinde olmayan türleri kabul etmek ve dönüştürmek boost::variant
için normal bir davranış mı?boost :: variant - neden "const char *" "bool" olarak dönüştürülür?
#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;
}
çıkışı:
türü: Diğer -> 1
türü: dize -> Bazı dize
Ben MyVariant gelen bool türü kaldırmak ve bu onu değiştirirseniz:
typedef variant<string, int> MyVariant;
const char*
bool
'a dönüştürülmez. Bu sefer string
dönüştürülmediği ve bu yeni çıkışı:
türü: dize -> Bazı dize
türü: dize -> Buvariant
çalışır diğer türleri dönüştürmek olduğunu gösterir bazı dize
önce bool
ve sonra string
. Tür dönüşümü kaçınılmaz bir şeyse ve her zaman yapılmalıysa, string
'a daha yüksek bir öncelik vermenin herhangi bir yolu var mı?
Açıklamanızı tamamlamak için: herhangi bir işaretçi türünden "bool" değerine örtülü bir dönüşüm var ve yerleşik tanımlı dönüşümler her zaman kullanıcı tanımlı dönüşümler için tercih edilir. Kurucular değişen gelince, başka bir sınıfta sınıf kaydırmak veya ondan türetebilirsiniz (kullanıcı tanımlı. olarak 'std :: string' sayımları dönüşüm' Char * '). Bağlamıza bağlı olarak bunlardan biri uygun olabilir veya olmayabilir; her ikisi de bazı dezavantajları var. –
Bir çözüm MyVariant' 'dan' bool' çıkarmak ve bunun yerine, 0 ve 1 değerleri kullanmak olduğunu düşünüyorum. – Meysam
@Meysam: evet. Bunu öneren düşündü ama sonra muhtemelen 'FALSE' ile başlatıldı MyVariant' farklı olduğu '0' ile başlatıldı bir' MyVariant' istediğini sanıyordum. Onların aynı olması için sorun varsa, sadece 'bool' kaldırın. Farklı anlamları varsa, o kadar basit değil. –