是否可以定义某种可以为结构创建通用可比运算符的模板?
例如,这样的事情可能吗?
struct A
{
int one;
int two;
int three;
};
bool AreEqual()
{
A a {1,2,3};
A b {1,2,3};
return ComparableStruct<A>(a) == ComparableStruct<A>(b);
}
Run Code Online (Sandbox Code Playgroud)
所有这些都是结构的字段比较.您可以假设所有字段都是基本类型或重载operator ==.
我有很多像这样的结构,如果我可以把它放在一个模板或者用于比较的东西而不是为每个结构定义一个运算符==,它将节省我很多时间.谢谢!
看起来这对C++来说是不可能的.我想知道为什么这个被Clas提案投票,如果有人有理由让我们知道!
对于使用基本类型的解决方案,请参阅R Sahu的解决方案.
从我对 OO 设计/模式/原则的所有阅读和研究中,我发现普遍的共识是松耦合(和高内聚)几乎总是更好的设计。我完全同意从我过去的软件项目经验中发言。
但是,假设某个特定的软件公司(我不在其中工作)有一些设计有问题的大型软件,可以与某些硬件进行交互。这些模块(我从未研究过)是如此紧密耦合,并且函数调用可以深入 20 多个级别来管理状态。类边界从来没有明确定义,用例也没有考虑清楚。一个优秀的软件开发人员(不是我)会提出这些问题,但只会被更高级的开发人员拒绝,因为开发实践(如 SOLID 或 TDD)并不真正适用,因为该软件已经使用“传统”方法运行多年,再改变也晚了。客户(我不知道他们是谁)最大的抱怨是产品质量。
由于上述不切实际的场景(我从来没有分开过),我想过是否存在首选甚至需要紧耦合的情况?什么情况下开发人员需要跨越模块边界并共享状态并增加依赖性并降低可测试性?有哪些系统如此复杂以至于需要这样做?我自己想不出一个好的案例,所以我希望一些更有经验的工匠可以帮助我。
谢谢。再说一遍,我不知道这家公司。
例如:
InitEmployee()
{
vector<Employee> employeeList = {
Employee("Clark Kent",0),
Employee("Bruce Wayne",1),
...
Employee("Hal Jordan",65535)
}
}
Run Code Online (Sandbox Code Playgroud)
我无法从文件或数据库查询,因为此程序需要在单个可执行文件中,因此所有常量数据必须是硬编码的.我实际上使用boost的multi_index_container按名称和id进行快速查找但是为了简单起见,我在这里使用了vector作为示例.问题是我在单个函数中没有那么多(2 ^ 16)个常量数据而没有堆栈溢出.有没有更好的方法来初始化这个列表而不拆分功能?
我正在使用VC12.谢谢!
更新
见选择的答案.正如其他人所提到的,使用static会强制它继续数据而不是堆栈.这就是我最终得到的结果:
InitEmployee()
{
static Employee employeeList[] = {
{"Clark Kent",0},
{"Bruce Wayne",1},
...
{"Hal Jordan",65535}
}
vector<Employee*> employeeVec;
int count = sizeof(employeeList) / sizeof(Employee);
for (int i = 0; i < count; i++)
{
employeeVec.emplace(&employeeList[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是Employee类使用的是字符串类而不是c-string,所以我不想在内存中使用它的两个副本.这样我最终只得到指针的额外内存,这仍然是很多,但我相信这是最好的选择!也适用于multi_index_container!谢谢
c++ ×2
constants ×1
containers ×1
coupling ×1
decoupling ×1
equality ×1
generics ×1
hardcode ×1
large-data ×1
oop ×1
struct ×1
templates ×1