【发布时间】:2013-03-27 08:30:40
【问题描述】:
在编写 C++ 模板函数时,我必须检查此函数使用的变量类型是否为整数。如果是这种情况,应该会导致编译错误。
template <class IT> void foo( IT first, IT last ) {
// check here that *first has integral type.
}
我的问题是,这个函数模板参数不是直接使用的类型,而是一个迭代器类型。
不幸的是,我目前处于无法使用 C++11 或 Boost 的环境中,因此我将不得不自己尝试重新发明这个轮子。
我最终通过定义一个指向数组的指针,使用参数数组大小来测试该类型是整数。如果参数类型是非整数,这会产生编译错误。
template <class IT> void foo( IT first, IT last ) {
int ( * fake_array_ptr )[*first]; // Error: size of array has non-integral type
}
我的问题是:还有其他更显式的方法来测试一个类型是否是整数?
【问题讨论】:
-
"注意:我不能使用 C++11,也不能使用 Boost。" -- 为什么?请告诉我你不能使用 Boost 的充分理由。
-
@DidierTrosset 看来您必须实现自己的
is_integral模板。 -
来吧伙计们,事情没那么简单。在项目中使用第三方库有法律上的影响——我知道我们认为这很愚蠢,但对法律人员来说,这种事情非常重要。很多时候,有人认为 Boost 过于依赖。如果“没有 Boost”作为要求,那么答案不应该是“无论如何都要使用它”。
-
@Xeo:是的,直到你的经理审查它并说“你认为你在做什么”。抱歉,有时我们必须处理这种称为“现实世界”的想法,它的行为并不总是如您所愿。
-
@BartekBanachewicz:不是吗?也许有一天,当你遇到我所说的这个现实世界时。如果您的老板告诉您“不要使用 boost”,然后您将 boost 代码复制/粘贴到您的项目中,他会很生气。理所当然的。如果你的团队决定不使用 boost,那么即使你不喜欢它,你也要坚持下去。因为其他任何事情都是混蛋
标签: c++ templates iterator integer typechecking