1

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

---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完全定义类型之后。但似乎代码的类型解析发生在模板定义存在的地方,而不是实例化(在源文件中)

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

4

2 回答 2

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;

我希望这有帮助。

于 2013-03-30T04:12:40.650 回答
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;
  ...
}
于 2013-03-30T14:54:59.357 回答