私は非常に古い(20年以上)非常に大きな(15 KLOC)ライブラリを維持しており、現在整数で識別されているさまざまなタイプのオブジェクトがあります。これは、整数を指定しただけでは、どのタイプのオブジェクトを識別すべきかわからないという問題を引き起こします。これは、コンパイル時に行うと非常に便利です。
最小限の変更で思いついた解決策は、IDテンプレートを作成してから、さまざまなタイプのオブジェクトIDのtypedefを作成することでした。
2つのまったく異なる識別子が同じ基本的なタイプと範囲を持つ可能性があるため、テンプレートに3番目のパラメーターを追加する必要があることに気付きました。
私はC++が考慮していないことを発見しました
typedef int X;
typedef int Y;
全く違うタイプとして。
この解決策ですか:-
A)合理的(私はそれが機能することを知っています)
B)これを行う別の簡単な方法はありますか-経営陣はLOCの高い変化を恐れています
例の演算子のみによるソリューションの簡素化。
#include <iostream>
// Horrible old definition of current code
class OldObjectA
{
public:
int ident_; // int identifier
int uniq_; // another int identifier unique to OldObjectA's only
};
class OldObjectB
{
public:
int ident_;
int next_; // int of another OldObjectB ident_
int uniq_; // another int identifier unique to OldObjectB's only
int dq_; // int of yet anothera OldObjectB ident_
int com_; // int of ident_ of a OldObjectA
int ld_; // int of ident_ of a OldObjectC
};
class OldObjectC
{
public:
int indent_;
int next_; // int of another OldObjectC ident_
int com_; // int of ident_ of a OldObjectA
};
enum Type { TypeA, TypeAU, TypeB, TypeBU, TypeC };
template<class T, T maxval, Type type>
class ID
{
public:
friend bool operator==(const ID<T, maxval, type> &lhs, const ID<T, maxval, type> &rhs)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
return true;
}
};
typedef ID<int, 42, TypeA> ID_A;
typedef ID<int, 42, TypeAU> ID_UniqA;
typedef ID<int, 42, TypeB> ID_B;
typedef ID<int, 42, TypeBU> ID_UniqB;
typedef ID<int, 100, TypeC> ID_C;
// What I was thinking of doing
class NewObjectA
{
public:
ID_A ident_; // int identifier
ID_UniqA uniq_; // another int identifer
};
class NewObjectB
{
public:
ID_B ident_;
ID_B next_; // int of another OldObjectB ident_
ID_UniqB uniq_; // another int
ID_B dq_; // int of yet anothera OldObjectB ident_
ID_A com_; // int of ident_ of a OldObjectA
ID_C ld_; // int of ident_ of a OldObjectC
};
class NewObjectC
{
public:
ID_C indent_;
ID_C next_; // int of another OldObjectC ident_
ID_A com_; // int of ident_ of a OldObjectA
};
int main(int argc, char *argv[])
{
std::cout << "================================================================================\n";
ID_A a,a2;
ID_UniqA au,au2;
ID_B b,b2;
ID_UniqB bu,bu2;
ID_C c,c2;
a==a2;
au==au2;
b==b2;
bu==bu2;
c==c2;
// wanted and expected compile time fails
// a=au;
// a=b;
// a=bu;
// a=c;
// au=b;
// au=bu;
// au=c;
// b=bu;
// b=c;
std::cout << "================================================================================\n";
return 0;
}