在指定模板类之前使用它

时间:2015-05-04 11:48:17

标签: c++ templates

出于某种原因,我必须将value作为类型指定的模板类从它自身返回。但问题是模板类继承自非模板类,其中有一个方法返回类型指定模板类的值。

应该是这样的:

class Base
{
    // ...
    _Int Foo() = 0;
};

template<typename T>
class Derived
    : public Base
{
public:
    // ...
    _Int Foo() override
    {
        // ...
    }
};

typedef Derived<int> _Int;

所以我的问题是:有没有办法可以帮助我在定义之前使用指定类型的模板类?

2 个答案:

答案 0 :(得分:3)

要声明函数的返回类型,您不需要该类型的定义,只需要声明它的声明。这意味着你可以这样做:

template <class T>
class Derived;

typedef Derived<int> _Int;

class Base
{
    // ...
    virtual _Int Foo() = 0;
};

template<typename T>
class Derived
    : public Base
{
public:
    // ...
    _Int Foo() override
    {
        // ...
    }
};

[Live example]

两个附注,与问题无关:

  • virtual声明中的代码遗失Foo

  • 任何以下划线后跟大写字母开头的名称都保留给C ++实现(编译器和标准库),不得在用户代码中使用。您应该将名称_Int更改为其他名称。

    同样保留包含两个连续下划线的名称,并以全局范围保留以下划线开头的名称。

答案 1 :(得分:2)

这是curiously recurring template pattern的一个实例,可以通过将派生类作为基类的模板参数来使用:

template<typename Int>
class Base
{
    // ...
    virtual Int Foo() = 0;
};

然后在继承时显式传递:

template<typename T>
class Derived
    : public Base<Derived<T>>
{
public:
    // ...
    Derived<T> Foo() override
    {
        // ...
    }
};

Live demo