我试图让程序员(使用我的库)创建可命名的类型实例,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
开关将由程序员描述性地命名并指定触发字符串(例如,名为递归的开关可以具有"-r"
和"-recursive"
作为触发器)。必要时,您应该能够轻松获得开关的设置。实施细节:ArgMan
会有一个std::unordered_map<std::string/*a trigger*/, ??/*something linking to the switch to set on*/>
. 这确保了argV
相对于的几乎线性解析argC
。我应该如何处理这个?