C++ 嵌套模板的几个级别。我怎样才能让它工作?

C++ 嵌套模板的几个级别。我怎样才能让它工作?,c++,templates,template-meta-programming,typetraits,C++,Templates,Template Meta Programming,Typetraits,我正在做一些模板元编程,我遇到了这样的情况,首先我有几个类,如:- template <typename Q> struct Object { public: Q data; }; template <typename P> class CircleObject : public Object<const typename P::Circle> { }; template <typename P> class SquareObject :

我正在做一些模板元编程,我遇到了这样的情况,首先我有几个类,如:-

template <typename Q>
struct Object {
 public:
  Q data;
};

template <typename P>
class CircleObject : public Object<const typename P::Circle> {
};

template <typename P>
class SquareObject : public Object<const typename P::Circle> {
};

template <typename P>
class Storage {
 public:
  typedef CircleObject<P> MyCircle;
  typedef SquareObject<P> MySquare;
};
模板
结构对象{
公众:
Q数据;
};
模板
类CircleObject:公共对象{
};
模板
类SquareObject:公共对象{
};
模板
类存储{
公众:
typedef CircleObject

MyCircle; typedef-SquareObject

MySquare; };

现在,我试图定义这些物体的一些特征:-

template <typename P>
struct CircleTraits<Storage<P> > {
  template <typename otype>
  struct IsCircle {
    static const bool VALUE = false;
  };
};

template <typename P>
struct CircleTraits<Storage<P> >::IsCircle<Storage<P>::MyCirlce> {
  static const bool VALUE = true;
};
模板
结构圈{
模板
结构IsCircle{
静态常量布尔值=假;
};
};
模板
结构CircleTraits::IsCircle{
静态常量布尔值=真;
};
但是,这是不正确的(编译错误)。我尝试了一种反复尝试的方法,将类型名和模板参数放在任何地方,但如果没有对模板专门化的深入了解,我就无法真正解决这个问题。有人能帮忙吗

我希望在以后的函数中实现以下功能:-

typedef Storage<RedObjects> RedStorage;

template <typename SpecializedStorage>
class Processor {
  typedef CircleTraits<typename SpecializedStorage> MyCircleTraits;

  template <typename ObjectType>
  void foo(ObjectType& data);
};

template <typename SpecializedStorage>
template <typename ObjectType>
void foo(ObjectType& data) {
  if (MyCircleTraits::template IsCircle<ObjectType>::VALUE) {
    // do something about the damn circles
  }
}
typedef存储RedStorage;
模板
类处理器{
typedef CircleTraits MyCircleTraits;
模板
void foo(对象类型和数据);
};
模板
模板
void foo(对象类型和数据){
if(MyCircleTraits::template IsCircle::VALUE){
//对那些该死的圆圈做点什么
}
}

我认为你不能那样做,你可能应该使用SFINAE来解决这样的问题:

//C++11 version
template<typename T>
struct IsCircle
{
private:
    template<typename Z>
    constexpr static bool _is(typename Z::MyCirlce*) //if Z dont have `MyCirlce` then this function is removed
    {
        return true;
    }
    template<typename Z>
    constexpr static bool _is(...) //fallback function
    {
        return false;
    }
public:
    static const bool VALUE = _is<T>(nullptr);
};

//C++98 version
template<typename T>
struct IsCircle
{
private:
    struct a { char a; }; //size ~1
    struct b { char a[8]; }; //size ~8
    template<typename Z>
    static b _is(typename Z::MyCirlce*);
    template<typename Z>
    static a _is(...);
public:
    static const bool VALUE = sizeof(_is<T>(0)) == sizeof(b);
};
//C++11版本
模板
结构IsCircle
{
私人:
模板
constexpr static bool _is(typename Z::MyCirlce*)//如果Z没有'MyCirlce',则删除此函数
{
返回true;
}
模板
constexpr static bool _是(…)//回退函数
{
返回false;
}
公众:
静态常量布尔值=_为(nullptr);
};
//C++98版本
模板
结构IsCircle
{
私人:
结构a{char a;};//大小~1
结构b{char a[8];};//大小~8
模板
静态b_是(typename Z::MyCirlce*);
模板
静态a_为(…);
公众:
静态常量布尔值=sizeof(_为(0))==sizeof(b);
};

我不清楚你要达到什么目的。你是说
模板结构对象
?@sehe是的,那是个打字错误。修复了它。@Danvil我添加了更多的代码来解释我要做的事情。我还没有在我们的环境中访问C++11。。。这将解决很多问题…现在我也有了C++98版本