【问题标题】:better way to shrink copy/paste codes缩小复制/粘贴代码的更好方法
【发布时间】:2015-07-20 23:56:21
【问题描述】:

目前我有这个代码主干:结构向量v[myStruct]。它的大小是 3。我将这些结构命名为 myStruct_AmyStruct_BmyStruct_C。每段代码几乎相同,只是以名称作为后缀。

SomeMap someMap_A;
for (auto& pair : myStruct_A.hashMap) {
  SomeStruct someStruct = foo(pair);
  someMap_A[someStruct.key] = someStruct.value;
  anotherStruct_A[someStruct.nameX] = someStruct.bundle;
}
someVector.push_back[someMap_A];

所有三个 A、B、C 都需要做上述事情。这里的问题是,如果使用函数,我不知道如何分隔和指定名称。我需要获取基于所有这三个myStructs 输出的几个数据向量。

【问题讨论】:

  • 后缀是什么?如果您将结构作为参数传递,您不会关心它在函数中的命名方式。
  • 它们具有相同的数据类型。只是名字不同而已。我现在能想到的是为每个结构使用pair,并将其名称用于第二个条目。但这似乎很愚蠢......
  • @LeleDumbo 你是对的......只要我按顺序添加它们,我不在乎名字。当我从向量中提取最终结果时,我可以直接命名它们。
  • 据我所知,这里只需要一个普通函数,一个带有引用参数的函数。而且像你说的那样使用一对确实很愚蠢,而且行不通。
  • @Tas 这是示例代码,将在代码审查中作为题外话关闭

标签: c++ enums


【解决方案1】:

您可以使用宏来执行此操作。例如,这是一个简化版本:

#define process(i, suffix)  some_vect_ ## suffix.push_back(i);  \
                            some_set_ ## suffix.insert(i);


int main() { 
    std::vector<int> some_vect_A, some_vect_B, some_vect_C;
    std::set<int> some_set_A, some_set_B, some_set_C;

    for (int i = 0; i < 100; i++) {
        int val = rand();
        process(val, A); // adds `val` to `some_vect_A` and `some_set_A`
        process(val, B); // adds `val` to `some_vect_B` and `some_set_B`
        process(val, C); // adds `val` to `some_vect_C` and `some_set_C`
    }
}

这个特定的演示代码毫无意义(它在所有三个集合和所有三个向量中产生相同的结果),但确实显示了如何进行您需要的操作。

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多