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

私のシステムにクラス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を使用します。これは1つの可能な実装です:

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 に答える