maybe something like that ? (idea came from "C object'like struct using function pointers")
class utfCodepointViewWrap;
class utfStringViewWrap;
class utfStringViewAPI
{
public:
constexpr virtual utfCodepointViewWrap operator[] (const cpidx &aIdx) = 0;
constexpr virtual utfStringViewWrap substr(const cpidx& aStart, size_t aCount) = 0;
};
class utfStringViewWrap
{
public:
utfStringViewWrap(utfStringViewAPI& aThis) : mThis(aThis) {};
constexpr utfCodepointViewWrap operator[] (const cpidx &aIdx);
constexpr utfStringViewWrap substr(const cpidx& aStart, size_t aCount);
protected:
utfStringViewAPI& mThis;
private:
utfStringViewWrap()=delete;
};
constexpr utfStringViewWrap
utfStringViewWrap::substr (const cpidx &aStart, size_t aCount)
{
return mThis.substr(aStart, aCount);
};
class u16stringView : public utfStringViewAPI
{
public:
constexpr virtual utfCodepointViewWrap operator[] (const cpidx &aIdx) override { .... };
constexpr virtual utfStringViewWrap substr(const cpidx& aStart, size_t aCount) override {return utfStringViewWrap(*this);};
};