【发布时间】:2013-09-20 12:53:00
【问题描述】:
我试图让程序员(使用我的库)能够创建类型为 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"和"-recursive"作为触发器)。必要时,您应该能够轻松获得开关的设置。实现细节:ArgMan将有一个std::unordered_map<std::string/*a trigger*/, ??/*something linking to the switch to set on*/>。这确保了argV相对于argC的几乎线性解析。我应该如何处理?
【问题讨论】:
-
如果名称在编译时是固定的,您可以使用各种名称创建一个枚举,然后将实例存储在数组/向量中并将枚举转换为索引。
标签: c++ indexing command-line-arguments stdstring compile-time