実は、これはおそらく遅くなる可能性があり、二つの理由があります。
最初に、初期化されていないNodeIdを作成する方法はありません。通常、それは良いものです。しかし、あなたは次のようなコードを持っていると想像してください。
NodeId nodeid;
foo.initializeNodeId(&nodeid);
あなたは実際には必要ない余分な割り当てを行います。
特殊なコンストラクタを追加することで修正できます。 Foo :: initializeNodeId(& NodeId)を必要としないように、Foo :: createNodeId()を作成する方がはるかに優れていますが、Fooの定義を制御していない場合は不可能です。
第2に、NodeIdはコンパイル時定数式ではありません。 dasblinkenlightが示唆しているように、これはコードがパフォーマンス上の問題を引き起こすよりも合法ではないという問題を引き起こす可能性がはるかに高いですが、どちらも可能です。なぜなら、コンパイル時に実行された可能性のある実行時に、intを使用していた場合、コンパイラにコードを挿入して強制的に実行させるかもしれないので、これはNodeIdというクラスの問題ではないでしょう... )
C++ 11を使用している場合は、constexprで修正できます。また、コードを合法的なC++ 03にしたい場合は、マクロでそれを処理できます。
また、dasblinkenlightによって指摘されているように、2つの方法でconstが欠落しています。
最後に、クラス定義内で定義されたメソッドに "inline"を書く必要はありません。彼らはすでに本質的にインラインです。
はすべて一緒にそれを置く:
#if __cplusplus > 201000L
#define CONSTEXPR_ constexpr
#else
#define CONSTEXPR_
#endif
class NodeId
{
int value;
public:
struct Uninitialized {};
CONSTEXPR_ NodeId() : value(-1) {}
CONSTEXPR_ NodeId(Uninitialized) {}
CONSTEXPR_ NodeId(int value) : value(value) {}
CONSTEXPR_ operator int() const {return value;}
CONSTEXPR_ bool isValid() const {return value != -1;}
//...
};
今、あなたは余分-1割り当てのコストを避けるために、これを行うことができます。
NodeId nodeId(NodeId::Uninitialized());
foo.initializeNodeId(&nodeid);
そして、これは、合法的に非型テンプレートパラメータとしてNODEIDを使用する:
myClassTemplate<NodeId(3)> c;
それとも、これは、コンパイラが合法的にわずか4にXを初期化することができますしてくださいする:
int x = 3;
x += NodeId(1);
新しいコンパイラを使用する場合は、intを使用するのと同じにする必要があります。 – mfontanini
@mfontaniniなぜあなたは質問をdownvoteでしたか?これは質問への答えです。そのように投稿するべきです。 – leemes
@leemesなぜあなたはそれが私であると仮定していますか? – mfontanini