相关疑难解决方法(0)

在定义可交换操作时减少代码重复

我有一组名为的可交换二进制函数的重载overlap,它接受两种不同的类型:

class A a; class B b;
bool overlap(A, B);
bool overlap(B, A);
Run Code Online (Sandbox Code Playgroud)

overlap当且仅当一个形状与另一个形状重叠时,我的函数返回true - 这是讨论multimethods时使用的一个常见示例.

因为overlap(a, b)相当于overlap(b, a),我只需要实现关系的一个"侧".一个重复的解决方案是写这样的东西:

bool overlap(A a, B b) { /* check for overlap */ }
bool overlap(B b, A a) { return overlap(a, b);   }
Run Code Online (Sandbox Code Playgroud)

但我宁愿不N! / 2使用模板生成相同功能的额外简单版本.

template <typename T, typename U> 
bool overlap(T&& t, U&& u) 
{ return overlap(std::forward<U>(u), std::forward<T>(t)); }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这很容易无限递归,这是不可接受的:见 http://coliru.stacked-crooked.com/a/20851835593bd557

如何防止这种无限递归?我正确地解决了这个问题吗?

c++ templates metaprogramming

50
推荐指数
2
解决办法
2859
查看次数

局部变量和函数在C中可以使用相同的名称吗?

假设我有一个单一的,我有一个.c文件局部变量的一个.我可以在该c文件中有一个具有相同名称函数吗?

编辑:如果没有,为什么?

从概念上讲,局部变量存储在堆栈中,函数存储在内存的文本部分中.所以应该没问题吧?

当我尝试这个时,编译器给出了错误.我想知道这是特定于编译器还是实际上是一个错误.

c

9
推荐指数
4
解决办法
8541
查看次数

标签 统计

c ×1

c++ ×1

metaprogramming ×1

templates ×1