C++ 在没有编译失败的情况下,是否可以推断类型是否不完整?

C++ 在没有编译失败的情况下,是否可以推断类型是否不完整?,c++,templates,incomplete-type,template-argument-deduction,C++,Templates,Incomplete Type,Template Argument Deduction,我希望实现像sizeof(complete\u type)这样的行为,它将返回真实的sizeof,而sizeof(complete\u type)-将仅为0 我需要它为IPC(进程间)通信提供扩展运行时类型信息,每种类型的描述结构如下: struct my_type_info { bool is_pointer; size_t size; //for double* will be 4 on i386. that is sizeof(double*)

我希望实现像sizeof(complete\u type)这样的行为,它将返回真实的sizeof,而sizeof(complete\u type)-将仅为0

我需要它为IPC(进程间)通信提供扩展运行时类型信息,每种类型的描述结构如下:

struct my_type_info
{
    bool   is_pointer;
    size_t size;         //for double* will be 4 on i386. that is sizeof(double*)
    size_t base_size;    //for double* will be 8. that is sizeof(double)
};
当我的系统中出现类似MyOnlyDeclaredClass的类时,问题就出现了;我得到了编译错误,显然是因为我不能考虑它的大小

boost-type_-traits建议使用许多编译时类,但没有“is_-complete”

有趣的编译器有VS2008、VS2010、Clang3、gcc-4.6、gcc-4.7,它们像往常一样使用。这是一种可能的实现方式:

struct char256 { char x[256]; };

template <typename T>
char256 is_complete_helper(int(*)[sizeof(T)]);

template <typename>
char is_complete_helper(...);

template <typename T>
struct is_complete
{
    enum { value = sizeof(is_complete_helper<T>(0)) != 1 };
};
struct char256{char x[256];};
模板
char256是完整的辅助对象(int(*)[sizeof(T)];
模板
char是_complete_helper(…);
模板
结构已完成
{
枚举{value=sizeof(is_complete_helper(0))!=1};
};
例如:

#include <cstdio>

struct F;
struct G {};

int main()
{
    printf("%d %d\n", is_complete<F>::value, is_complete<G>::value);
    return 0;
}
#包括
结构F;
结构G{};
int main()
{
printf(“%d%d\n”,is_complete::value,is_complete::value);
返回0;
}
(注意:适用于(不,这不是因为C++0x)和Clang2.9,)

不要尝试这样做。 这从根本上说是不合理的。模板由类型参数化,而不是实例化点参数化。类类型本身不完整或不完整,在翻译过程中的某个点上是完整的

在某些类型上实例化的模板在每次实例化中必须具有完全相同的语义


如果没有,则不定义行为。

如果检测到类型不完整,您将怎么做?抛出静态断言错误?否如果指针位于共享内存中,我可以将其传递给另一个进程,而不知道它的类型。指针可以很容易地从它的值中减去共享内存基来传递。我似乎仍然不理解它。为什么不以这种方式传递所有指针(完整类型和不完整类型)?因为在我的系统中,呈现了另一种类型的指针,比如应该以另一种方式传递给另一个进程的接口。此外,它还允许在运行时检查指针来自哪种内存。我承认有能力以另一种不太优雅的方式解决任务。请告诉我们更多关于您真正需要做的事情。顺便说一下,这就是
boost::checked_delete
中使用的技巧。哇!测试结果:VS2008/VS2010(都是SP1):错误C2027使用未定义的类型“F”。g++-4.7-工作,叮当声-带警告工作。
struct;int i=(按事实计算(clang3-std=c++0x):(记住生成的实例…效果boost::shared_ptr用于记住完成的类型,该类型允许在不查看类型头的情况下删除它。+1.我也正要这样尖叫。while的想法从根本上被打破了。实际上,我对此有一个合理有效的用例。我一直在做一个小包装生成器将C++函数输出到其他语言的工具,我决定不尝试解析C++,而是使用变量模板来将函数声明分开。在这些情况下,我现在使用ISSO完成检查是否按要求派生某些类。如果他们不知道包装器工具的类型,那么如果C++类不符合规范,编译C++会失败,如果工具已经可以检查,它就失败了。