Ale czy można również sparametryzować stałą funkcji członka?
Nie, nie możesz. Nie masz dostępu w sygnaturze funkcji do niejawnego obiektu, na który wskazuje this
, więc nie można go w żaden sposób wysyłać na nim ani na szablonie. kwalifikatory cv w funkcjach składowych muszą być określone.
Aby uzyskać bardziej skomplikowane funkcje składowe, można wywołać jedno z nich (zazwyczaj non-const
wywołując numer const
, aby uniknąć UB), aby uniknąć powielania kodu.
Albo zawsze można napisać niebędącego państwem friend
:
struct Foo {
template <class T,
std::enable_if_t<std::is_base_of<Foo, std::decay_t<T>>::value>* = nullptr
>
friend T* self(T& x) { return &x; }
};
musimy SFINAE aby self()
nie znaleziono dla niespodziewanych typów jak Wrapper<Foo>
. Zauważ, że jest to znacznie dłużej niż twój oryginalny kod, więc ma to sens tylko w kontekście skomplikowanej logiki.
Czy na pewno być zabawny czy UFCS został przyjęty i teraz wszyscy napisać nasze const
/innych niż const
przeciążeń za pośrednictwem będącego członkiem friend
ów, że nadal wywoływać jakby byli członkami.
Twoje drugie pytanie powinno zostać usunięte. Mogło, ale wątpię, żeby ktokolwiek mógł to udowodnić. – NathanOliver
Nie jest jednak trudno wdrożyć tę funkcjonalność za pomocą specjalistycznego szablonu klasy podstawowej. –
'const (wyrażenie)' byłoby miłe. Wraz z 'noexcept (auto)' – krzaq