2015-10-15 56 views
2

我有一些特殊的數字類。該類可以由雙來構造:(有沒有)在數值表達式中使用隱式轉換?

struct FancyDouble{ 
    FancyDouble& operator = (double v){ 
    this->value = v; 
    return *this; 
    } 
}; 

FancyDouble myFancyDouble = 5.0; 

的類提供的(隱含的)轉換來自doubleFancyDouble。有沒有辦法做相反的事情?所以,當我在一個數字表達式中使用FancyDouble,我想寫:

double a = 123; 
double b = b * myFancyDouble; 

我看看到參考,我認爲這是不可能的,但我沒有絕對的把握。

+0

上面引用的* assignment *操作符的存在與這個事實無關,該類可以在構造過程中用'double'初始化*灰。後者由類構造函數支持。它不涉及賦值運算符。 – AnT

回答

5

是的,你可以。他們被稱爲轉換運營商:

struct FancyDouble 
{ 
    // your things here 
    operator double() { return this->value; } 
}; 

您可以轉換爲任何類型,而不僅僅是內置類型。它們通常也被標記爲const(雖然我沒有在這裏做出來顯示核心概念)。

請注意,您的結構(如圖所示)並不完全允許從doubleFancyDouble的隱式轉換;您的operator=僅意味着您可以在作業的右側使用雙精度型,但如果您有FancyDouble函數參數,則它將不起作用,因爲您需要的是一個構造函數,它接受雙精度值,而不是賦值運算符。

void foo(FancyDouble fd); 
foo(4.4); // does not work because you can't construct a FancyDouble from a double 
      // even though you have an assignment operator 

你會做這樣的事情:

struct FancyDouble 
{ 
    // your things here 
    FancyDouble(double d) { /* initialization here */ } 
}; 

有了這個,你只需要接受一個FancyDouble代替doubleoperator=,轉換會自動完成:

struct FancyDouble 
{ 
    // your things here 
    FancyDouble(double d) { /* initialization here */ } 
    FancyDouble& operator=(FancyDouble fd) { /* assignment here */ } 
}; 

FancyDouble fd = 4.2; // works 
fd = 5.5; // also works, because FancyDouble can be constructed implicitly from a double 
+1

請不要在一個類中使用隱式構造函數(採用double)和隱式轉換運算符(double)。 –

+0

非常感謝這個偉大的答案! – Michael

相關問題