Is it possible to deduce whether type is incomplete without compilation failure?

后端 未结 2 508
借酒劲吻你
借酒劲吻你 2021-01-18 18:02

I want to achieve behavior like sizeof(complete_type) will return real sizeof, and sizeof(incomplete_type) - will be just 0

I need this to provide extended run time

相关标签:
2条回答
  • 2021-01-18 18:08

    Use SFINAE, as usual. This is one possible implementation:

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

    Example:

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

    (Note: Works on gcc 4.5 (no it's not because of C++0x) and clang 2.9, but not gcc 4.3)

    0 讨论(0)
  • 2021-01-18 18:24

    Do not try to do that.

    It is fundamentally unsound. Templates are parametrized by types, not instantiation point. A class type is not complete or not in itself, it is complete at some point during translation.

    A template instantiated on some types must have the exact same semantic in every instantiation.

    If not, the behaviour is not defined.

    0 讨论(0)
提交回复
热议问题