5

我想实现像 sizeof(complete_type) 这样的行为将返回真正的 sizeof,而 sizeof(incomplete_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)
};

当进入我的系统时出现问题,例如 class MyOnlyDeclaredClass; 我得到了编译错误,显然是因为我无法确定它的大小。

boost type_traits http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/index.html建议许多编译时类,但没有“is_incomplete”

有趣的编译器有 VS2008、VS2010、clang 3、gcc-4.6、gcc-4.7

4

2 回答 2

11

不要试图那样做。

从根本上说是不健全的。模板是按类型参数化的,而不是实例化点。类类型不完整或本身不完整,它在翻译过程中的某个时间点是完整的。

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

如果不是,则未定义行为。

于 2011-12-09T23:09:08.453 回答
3

像往常一样使用SFINAE。这是一种可能的实现:

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 };
};

例子:

#include <cstdio>

struct F;
struct G {};

int main()
{
    printf("%d %d\n", is_complete<F>::value, is_complete<G>::value);
    return 0;
}

(注意:适用于gcc 4.5(不,不是因为 C++0x)和 clang 2.9,但不适用于 gcc 4.3

于 2011-12-09T17:16:11.920 回答