代码:
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));
}
我不知道还有什么可说的,静态功能感觉不像解决方案,但这就是问题所在。
答案 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);