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