CRTP и функции, которые возвращают экземпляр производного типа

Я пытаюсь создать базовый класс с функциями, которые при наследовании возвращают экземпляры подкласса. Абстрактная версия того, что я сейчас пытаюсь:

Ах:

#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;
}

Bh:

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

B.cpp:

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

То, что я хочу, чтобы иметь возможность сделать это что-то вроде следующего:

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

Тем не менее, я не могу найти способ организации кода для достижения этой цели. Я не уверен, есть ли какая-то форма предварительного заявления, которая должна быть здесь или что. Пробовал несколько вещей, но не повезло. Мысли?

1 ответ

Вы ищете этот синтаксис?

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), чтобы сделать его доступным для своих пользователей.

Другие вопросы по тегам