【发布时间】:2013-03-21 00:56:27
【问题描述】:
我想创建一个模板来检查类类型是否为原始类型(int、char、float、float*** 等...)。这样做的原因是为了防止另一个模板尝试扩展原语并导致编译时错误。到目前为止,我有一些类似的东西:
#include <typeinfo>
template<typename T>
struct is_primitive{
const static bool value=std::is_fundamental<T>::value;
};
显然,这只是现在转发 is_fundamental 的结果。我想添加 remove_pointer、remove_reference 等...以去除输入类的所有这些额外修饰符。 为了使 T 尽可能裸露,需要删除哪些内容?
另外,类似以下的解决方案也同样出色:
template<typename T>
struct is_inheritable{
const static bool value=???;
};
但我很确定不可继承类的集合等于原始类的集合。
【问题讨论】:
-
听起来你想要
is_fundamental。请注意(如您的问题中所写),类类型永远不是原始(基本),因为始终通过class或struct引入类类型。 -
哇,我不知道为什么我错过了它,但我认为它没有捕捉到所有我可能不知道的引用、指针部分和其他东西(对真实的 C++ 世界)。我会用 is_fundamental 更新我的问题。
-
T的“baring”通常称为Unqualified<T>,链接RemoveCv<RemoveReference<T>>就足够了——引用不能是 cv 限定的,所以它们必须在顶层。您不能拥有对引用的引用或指向引用的指针,因此它们必须位于顶层。之后,只需剥离 cv-qualificaiton。 (Cv 限定意味着 const 和/或 volatile 限定。) -
您能否更具体地说明一下为什么首先需要这个?可能是一种更简单的方法。
-
@Aggieboy:经典XY problem。你的解决方案不是一个好的解决方案,因为它肯定不能解决问题。即使忽略您假设存在 vtable 指针(C++ 不需要的实现细节)这一事实,我也可以通过在某些 C++ 编译器上传递一个空类来轻松破坏您的代码。空类必须有大小,但空基优化意味着派生类可以与基类大小相同,即使有额外的 vtable 指针。