2

名前空間を「リセット」する方法があるかどうか疑問に思っていました。定義を使用して別の名前空間でいくつかのテンプレート構造体を特殊化したいので、私は主にこれを求めています。

これは、私が達成したいことの簡単な例です。

namespace base {
    template<typename>
    struct my_traits;
}

// specialize base::my_traits for TYPE
// obviously, this does not work
#define MAKE_SPECIALIZED_TRAITS(TYPE)           \
    namespace ::base {                          \
        template<>                              \
        struct my_traits<TYPE> {                \
            typedef TYPE type;                  \
            enum { size = TYPE::size };         \
        };                                      \
    }

namespace spec {
    struct my_struct {
        enum { size = 3 };
    };

    MAKE_SPECIALIZED_TRAITS(my_struct)
}

そのようなことは可能ですか?もしそうなら、これをどのように実装しますか?

4

3 に答える 3

1

名前空間で名前を定義したくない場合は、名前空間で名前を定義しないでください。

namespace spec {
    struct my_struct {
        enum { size = 3 };
    };
}
MAKE_SPECIALIZED_TRAITS(spec::my_struct)

ちなみに、マクロの最後のセミコロンは省略して、マクロが使用される場所に置きます。それは私にとってより「普通」に見えます:

MAKE_SPECIALIZED_TRAITS(my_struct);
于 2013-06-17T20:22:15.040 に答える
0

これは機能しませんか?

   #define MAKE_SPECIALIZED_TRAITS(TYPE)        \
        template<>                              \
        struct ::base::my_traits<TYPE> {        \
            typedef TYPE type;                  \
            enum { size = TYPE::size };         \
        };

アップデート:

私はテストでこれを機能させました:

名前空間ベース{テンプレート構造体my_traits; }

#define MAKE_SPECIALIZED_TRAITS(TYPE)        \
    namespace base { \
      template<>                              \
      struct my_traits<TYPE> {        \
          typedef TYPE type;                  \
          enum { size = TYPE::size };         \
      }; \
    }

namespace spec {
  struct s {
    enum { size = 10 };
    int o;
  };

}

MAKE_SPECIALIZED_TRAITS(spec::s)
于 2013-06-17T20:06:42.597 に答える