実際、これがおそらく遅くなる可能性がある2つの理由があります。
まず、初期化されていないNodeIdを作成する方法はありません。通常、それは良いことです。しかし、次のようなコードがあると想像してください。
NodeId nodeid;
foo.initializeNodeId(&nodeid);
実際には必要のない追加の割り当てを行うことになります。
特別なコンストラクターを追加することで、これを修正できます。Foo :: createNodeId()を作成する方がおそらくはるかに優れているので、Foo :: initializeNodeId(&NodeId)は必要ありませんが、Fooの定義を制御しない場合は、それが不可能な場合があります。
次に、NodeIdはコンパイル時の定数式ではありません。dasblinkenlightが示唆しているように、これはパフォーマンスの問題を引き起こすよりも、コードが合法でないという問題を引き起こす可能性がはるかに高くなりますが、両方とも可能です。(なぜですか?intを使用している場合、実行時に実行時に実行できるコードをコンパイラに挿入させている可能性があるためです。これは、NodeIdというクラスの問題である可能性が高いわけではありません… )。
幸い、C ++ 11を使用している場合は、constexprを使用して修正できます。また、コードを正当なC ++ 03にしたい場合は、マクロを使用して処理できます。
また、dasblinkenlightが指摘しているように、2つの方法でconstが欠落しています。
最後に、クラス定義内で定義されているメソッドに「インライン」を記述する理由はありません。それらはすでに本質的にインラインです。
すべてを一緒に入れて:
#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;
または、これは、コンパイラが合法的にxを4に初期化できることを確認するためです。
int x = 3;
x += NodeId(1);