这感觉就像一个反模式,有更好的方法(C ++ - 分配给引用)

时间:2014-07-28 12:58:33

标签: c++

代码:

static Layout::Pad& chooseFirst(Layout::Pad& A, Layout::Pad& B, bool swap) {
    if(swap) { return B; } else { return A; }
}

static Layout::Pad& chooseSecond(Layout::Pad& A, Layout::Pad& B, bool swap) {
    if(swap) { return A; } else { return B; }
}

void FlowchartDrawArea::addEdge(Layout::Pad& A, Layout::Pad& B) {
    bool swap = false;
    if(A.getPadDir() == Layout::PAD_DIRECTION::IN) {
        swap = true;
    }
    Layout::Pad& source = chooseFirst(A,B,swap);
    Layout::Pad& dest = chooseSecond(A,B,swap);

    flowchart.addEdge(new Edge(source,dest));
}

我不知道还有什么可说的,静态功能感觉不像解决方案,但这就是问题所在。

4 个答案:

答案 0 :(得分:11)

Layout::Pad& source = swap ? B : A;
Layout::Pad& dest = swap ? A : B;

flowchart.addEdge(new Edge(source,dest));

答案 1 :(得分:9)

这个怎么样:

if(A.getPadDir() == Layout::PAD_DIRECTION::IN) {
    flowchart.addEdge(new Edge(B,A));
} else {
    flowchart.addEdge(new Edge(A,B));
}

答案 2 :(得分:5)

一般而言,重新座位实际上是指针闪耀的地方,尽管如果你真的希望避免使用std::reference_wrapper<T>,你可以设法让人迷惑。

void FlowchartDrawArea::addEdge(Layout::Pad& A, Layout::Pad& B) {
    Layout::Pad* source = &A;
    Layout::Pad* dest = &B;

    if(A.getPadDir() == Layout::PAD_DIRECTION::IN) {
        std::swap(source, dest);
    }

    flowchart.addEdge(new Edge(*source, *dest));
}

答案 3 :(得分:2)

如果你在多种类型上使用它,我会使用一个小的模板化函数,如:

template <typename T>
std::pair<T,T> swap_if(T t1, T t2, bool swap)
{
    return swap 
        ? std::make_pair(t2, t1) 
        : std::make_pair(t1, t2);
}

可以像以下一样轻松使用:

std::string first{"first"};
std::string second{"second"};    
auto swapped = swap_if(first, second, true);

std::cout << swapped.first << ", " << swapped.second << std::endl;

输出:

second, first

否则,这样的简单事就足够了:

auto swapped = swap ? std::make_pair(edge2, edge1)  : std::make_pair(edge1, edge2);