template<int A, int B>
struct GCD {
enum { value = GCD<B, A % B>::value };
};
/*
Because GCD terminates when only one of the values is zero it is impossible to define a base condition to satisfy all GCD<N, 0>::value conditions
*/
template<>
struct GCD<A, 0> { // This is obviously not legal
enum { value = A };
};
int main(void)
{
::printf("gcd(%d, %d) = %d", 7, 35, GCD<7, 35>::value);
}
4条答案
按热度按时间sigwle7e1#
我终于想通了...
字符串
注意,根据你的整数有多大,你可能需要包括更多的中间步骤(例如GCD_9,GCD_10等)。
希望这对你有帮助!
nafvub8i2#
部分基于Kevin的回答,这里有一个宏序列,它有常量值的编译时失败和运行时错误。
如果失败不是一个选项,它也可以被配置为拉入一个非编译时函数。
字符串
注意扩展太大,即使它会提前终止,因为编译器必须在评估之前完全插入所有内容。
ovfsdjhp3#
我知道你只对C实现感兴趣,但我想我还是要评论一下C和模板元编程。我不完全相信这在C中是可能的,因为你需要定义好的初始条件来终止递归扩展。
字符串
这在C++0x中可能是可能的,但不确定。
wz3gfoph4#
字符串