プログラマー (私のライブラリを使用する人) がX
、クラスのインスタンス内に格納されているC
(または少なくともそのインスタンスに限定されている) 型の名前付きインスタンスを作成できるようにしようとしています。これらは、私が思いついた唯一の(醜い)ソリューションです(言うまでもなく、私はC ++を手に入れています)
1)
class C
{
public:
class XofC
{
public:
XofC() = delete;
XofC(C& mom)
{
mom.Xlist.emplace_front();
ref = Xlist.front();
}
X& access()
{
return ref;
}
private:
X& ref;
};
//etc
private:
std::forward_list<X> Xlist;
friend class XofC;
//etc
}
問題:
どこにでも XofC インスタンスを渡さなければならない。
2)
class C
{
public:
void newX(std::string);
X& getX(std::string);
//etc.
private:
/*possible run-time mapping implementation
std::vector<X> Xvec;
std::unordered_map<std::string, decltype(Xvec.size())> NameMap;
*/
//etc
}
問題:
これで問題は解決しますが、コンパイル時に X ( ) のすべての名前が認識std::string
されるため、実行時のようなものを使用することによるオーバーヘッドが、std::unordered_map<std::string, decltype(Xvec.size())>
このような単純なことで私を悩ませます。
可能な ( ? ) 解決策: をコンパイル時にstd::string
自動インデックスに置き換える ( int
)。次に、次を使用できます。
class C
{
public:
void newX(int); //int: unique index calculated at compile time from std::string
X& getX(int); //int: unique index calculated at compile time from std::string
//etc.
private:
std::vector<X> Xvec;
}
質問:
- 3)はありますか?
- 2)に対してコンパイル時の解決策は可能ですか?
- これは実際の状況です。私は最初の C++ "プロジェクト" を開始していましたが、ユーザー フレンドリーでシンプルかつ高速な引数管理ライブラリの実践とユーティリティを使用できると考えました。指定されたスイッチに基づいて
ArgMan
を解析できるクラスを作成する予定です。argV
スイッチはプログラマーによってわかりやすい名前が付けられ、トリガー文字列が指定されます (たとえば、recurse"-r"
という名前のスイッチは、トリガーとしてandを持つことができ"-recursive"
ます)。必要に応じて、スイッチの設定を簡単に取得できる必要があります。実装ArgMan
の詳細:std::unordered_map<std::string/*a trigger*/, ??/*something linking to the switch to set on*/>
. これにより、 に対する のほぼ線形の解析が保証argV
されargC
ます。これにどのようにアプローチすればよいですか?