2017-11-06 5 views
0

あり同様の以前の質問がありますが、私は別の質問を見つけることができるすべてのもの:static_castまたはtoX()に対して「明示的演算子X」による型変換?


)関数スタイルのキャストとして、それまでのexpを実装する方法を決めるとき、私は検討すべき事は何ですかクラスでの不正な変換?私は機能toX()を持つことができ、

class myClass { 
public: 
    explicit operator std::string() const { 
     ... 
    } 
}; 
const myClass x{...}; 
std::string str = static_cast<std::string>(x); 

または::

C++ 11では

、私は明示的な変換演算子を持つことができます

私の
class myClass { 
public: 
    std::string toString() const { 
     ... 
    } 
}; 
const myClass x{...}; 
std::string str = x.toString(); 

一部は、彼らが同じだ考えています私の一部は、いくつかのシナリオやベストプラクティスのガイドラインが欠けているに違いないと思っています。 static_castを付与

myClass::explicit operator std::string()またはstd::string(myClass)への呼び出しを許可しますが、私はstd::string()は、変換コンストラクタを持たない場合の決定は、ここのように、変換がmyClass内で行わ持つように作られている時点での集中だけど、この区別は機能しません。また、継承階層間でのキャストも可能ですが、これはここでも行われません。

答えて

0

あなたのクラスがstd::stringへの変換が本当に意味をなさない文字列のように十分であると仮定して、両方を実装することをお勧めします。 (もちろん、メンバ関数は、単に他のを呼び出すことができます。)

私が実際に明示的な変換を使用して、指定されたオブジェクトを構築したい場合は、直接の初期化としてそれを書くことは、時には少しより自然である:

std::string s1{ x };   // Plain conversion. 
std::string s2 = x.toString(); // More verbose - could be good or bad 

しかし、私は名前付きオブジェクトを必要としないとき、メンバ関数を呼び出すことは非常に良く見えるキャストのいくつかのフォームを使用する必要より:

f(static_cast<std::string>(x)); // Blah. 
f(x.toString());    // Convenient. 

ちょうどやっての二つの方法を文書化するようにしてくださいそれは同じです。

関連する問題