默认模板参数

时间:2011-03-02 19:16:30

标签: c++ templates reflection properties metaprogramming

我正在测试一个属性系统,我想确保根类可以保存到最派生类的函数指针。结果我有一些工作。最派生的类当前正在工作(RC2),但是当前的中间类(RC1)将具有编译器错误。我希望能够实例化RC1和RC2。我在创建RC时会遇到的编译器错误(对于RC1<RC1> rc1test;行)

  

错误C2955:'RC1':使用类模板需要模板参数列表

     

错误C3203:'RC1':非专用类模板不能用作模板参数'PropertyOwner'的模板参数,预计是真实类型

我试图做RC1<> rc1test;,但这也没有帮助。这是来源,有没有人有任何建议?

#include <iostream>
#include <map>
#include <string>
using namespace std;

template<class T, class BaseClass>
class RBase : public BaseClass
{
public:
  typedef int (T::*GetFP)(void) const;

protected:
  std::map<const char*, GetFP> mGetFPs;

};

class CBase
{

};

template<class PropertyOwner>
class RC1;

template<class PropertyOwner=RC1>
class RC1 : public RBase<PropertyOwner, CBase>
{
public:
  int int1(void) const
  {
    return 1;
  }

  RC1()
  {
    mGetFPs.insert( pair<const char*, GetFP>("RC1I1I", &PropertyOwner::int1) );
  };

  virtual void inspection(void)
  {
    int test = 0;
  }
};

class RC2 : public RC1<RC2>
{
public:
  int int2(void) const
  {
    return 2;
  }

  RC2()
  {
    mGetFPs.insert( pair<const char*, GetFP>("RC2I2I", &RC2::int2) );
  };

  virtual void inspection(void)
  {
    int test = 0;
  }
};

int main(void)
{
  RC1<RC1> rc1test;

  RC2 rc2test;
  rc2test.inspection();

  return(0);
}

2 个答案:

答案 0 :(得分:1)

template<class PropertyOwner=RC1>
class RC1 /*...*/;

如果模板类型参数PropertyOwner存在默认参数,则它必须是类型。 RC1 不是类型。这是一个课堂模板。

答案 1 :(得分:1)

如果你可以使用boost那么你可以使用boost :: function和boost :: bind来做一个更干净的方法来获得你想要的指针。

    template <typename BC>
    class RBase : public BC
    {
    public:
        typedef int FunctionSignature (void) const;
        typedef boost::function<FunctionSignature> CallbackFunction;
    protected:
        std::map<const char*, CallbackFunction> mGetFPs;
    };

    class CBase
    {
    };

    class RC1 : public RBase<CBase>
    {
    public:
        RC1 () 
        { 
            mGetFPs.insert ( std::make_pair ( "RC1I1I", 
                                              boost::bind ( &RC1::int1, this ) ) );
        }
        int int1(void) const { return 1; }
    };


    class RC2 : public RC1
    {
    public:
        RC2 () 
        { 
            mGetFPs.insert ( std::make_pair ( "RC2I2I", 
                                              boost::bind ( &RC2::int2, this ) ) );
        }
        int int2(void) const { return 2; }
    };

实际上,你可以为boost :: function指定任何具有正确签名的函数,甚至可以使用boost :: bind来调整具有附加参数的函数(见下文)。

    class RC3 : public RC1
    {
    public:
        RC3 () 
        { 
            mGetFPs.insert ( std::make_pair ( "RC3I3I", 
                                              boost::bind ( &RC3::intN, this, 3 ) ) );
        }
        int intN(int n) const { return n; }
    };