前向声明和模板实例化上下文

时间:2013-03-30 03:51:20

标签: c++ templates

我有一个头向前声明一个struct,一个函数,并定义了一个使用struct具体类型的模板函数:

--- header.h

struct RegisterImpl;
RegisterImpl& getRegisterImpl();

template <typename Interface>
void registerModuleClass( .... )
{
  RegisterImpl& reg = getRegisterImpl();
  reg.data = 3;
  ...
}

--- source.cpp

struct RegisterImpl
{
  int data;
};

RegisterImpl& getRegisterImpl()
{
  static RegisterImpl instance;
  return instance;
}

struct testiFace
{
   virtual void Blah() = 0;
};

void useTemplate()
{
   registerModuleClass<testiFace>(....);
}

我希望模板函数registerModuleClass的实例化将在useTemplate发生,这发生在RegisterImpl类型完全定义之后。但似乎代码的类型解析发生在模板定义所在的位置,而不是实例化(在源文件中)

我在这里遗漏了什么吗?这里的困境是模板函数需要使用实现的具体类型,但具体类型发生在源文件中。有什么方法吗?

2 个答案:

答案 0 :(得分:1)

我不确定这个建议是否会对您的情况有所帮助,但这里有一个想法:您可以将代码包装在需要RegisterImpl作为模板参数的类模板中。

示例:

template<typename T>
struct Helper
{
    T & getRegisterImpl()
    {
        static T instance;
        return instance;
    }

    template<typename Interface>
    void registerModuleClass()
    {
        T & reg = getRegisterImpl();
    }
};

后来:

struct RegisterImpl
{
    int data;
};

Helper<RegisterImpl> helper;

我希望这会有所帮助。

答案 1 :(得分:0)

使其取决于模板参数:

template<typename T, typename...> struct depend { typedef T type; };

template <typename Interface>
void registerModuleClass( .... )
{
  typedef typename depend<RegisterImpl,Interface>::type LocalRegisterImpl;
  LocalRegisterImpl& reg = getRegisterImpl();
  reg.data = 3;
  ...
}