CRTP和返回派生类型实例的函数

时间:2016-04-28 18:16:28

标签: c++ inheritance crtp

我正在尝试创建一个带有函数的基类,这些函数在继承时返回子类的实例。我正在尝试的摘要版本:

A.H:

#include <string>    

template <typename Derived>
class A {

public:
    A<Derived>();

    Derived Append(wchar_t the_char) const;

protected:
    std::wstring some_string;

} // class A

A.cpp:

#include "A.h"

A<class Derived>::A() {}

Derived A::Append(wchar_t the_char) const
{
    Derived d(some_string);
    d.some_string += the_char;
    return d;
}

B.h:

class B : public A<B>
{
public:
    B();
};

B.cpp:

B::B() : A() {}

我希望能够做到的事情如下:

B theObj;
theObj = theObj.Append(L'h');

但是,我无法找到一种组织代码来实现这一目标的方法。我不确定是否有某种形式的前瞻声明需要在这里或什么。试了几件但没有运气。想法?

1 个答案:

答案 0 :(得分:2)

您在寻找这种语法吗?

template<class Derived>
Derived A<Derived>::Append(wchar_t the_char) const
{
    Derived d(some_string);
    d.some_string += the_char;
    return d;
}

将它放在cpp文件中不会有太大作用。您最好将其添加到头文件中,或者创建一些其他可以包含的文件(MS有时会调用.inl)以使其可供用户访问。