如果没有编译失败,是否有可能推断出类型是否完整?

时间:2011-12-09 17:03:37

标签: c++ templates incomplete-type template-deduction

我想实现像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)
};

当我的系统进入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

2 个答案:

答案 0 :(得分:10)

不要试图这样做。

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

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

如果没有,未定义行为。

答案 1 :(得分: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,but not gcc 4.3