【发布时间】:2018-07-07 19:37:28
【问题描述】:
大家!想要根据模板参数进行不同的方法编译。
template <unsigned long prec> class DFixed {
public:
unsigned long val;
...
template <unsigned long prec1> DFixed<prec> &operator-=(DFixed<prec1> d) {
#if prec==prec1
val -= d.val;
#elif prec<prec1
val -= d.val/(prec1/prec);
#else
val -= d.val*(prec/prec1);
#endif
return *this;
}
...
};
但是上面的代码调用 block for prec==prec1 即使对于不同的 prec。
【问题讨论】:
-
您的预处理器和模板编程的组合不起作用。请改用
if ()和else。不要担心“死代码”路径。编译器(非常)可能能够优化它们。 (如果有疑问,请查看程序集输出。);-) -
感谢您的回答!它有效,但编译器抱怨零除。这是警告,但这就是我开始尝试预处理器的原因。你知道一些在编译时比较模板参数并进行条件编译的方法吗?
-
如果你可以使用 c++17,你可以使用 if constexpr。
-
如果您确定带有
prec == 0(或prec1 == 0)的分支未处于活动状态,那么我不会太在意警告。它表明编译器确实将prec和prec1解析为值(这是最终优化的前提条件,它消除了相应的 if 分支,甚至是if ()s 本身。) -
虽然:
else if (prec < prec1)确实可以导致该分支变得活跃,例如prec == 0和prec1 > 0。恐怕您必须修改代码(附加if条件)以防止正确除以0。 (虽然编译器的警告是有道理的。)
标签: c++ templates conditional-compilation