c++ - 安定限界 - 伝達関数 安定性 判定



テンプレート化されたメンバ関数の安定性をパラメータ化することは可能ですか? (2)

しかし、メンバ関数の定数性をパラメータ化することも可能ですか?

いいえ、あなたがすることはできません。 あなたはthis指し示す暗黙のオブジェクトへの関数シグネチャでアクセスすることができないので、あなたはそれをディスパッチしたりそれをテンプレートにすることはできません。 メンバー関数のcv修飾子は綴らなければなりません。

より複雑なメンバ関数の場合は、コードの重複を避けるために、一方をもう一方(通常は非const UBを回避するためにconstを呼び出す)で呼び出すことができます。

それとも、あなたはいつも非会員の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; }
};

self()Wrapper<Foo>ような予期しない型に対して見つけられないことを保証するためにSFINAEが必要です。 これは元のコードよりもかなり長いので、実際には複雑なロジックを使用している場合にのみ意味があります。

UFCSが採用されたならば、きっとおかしくないでしょう。そして今、私たち全員が、メンバーfriendのようにまだ呼び出す非メンバーfriendを介したconst / non- constオーバーロードを書きます。

テンプレートは、関数名自体とは別に、関数シグネチャに関するほとんどのものをパラメータ化可能にします。 しかし、メンバ関数の定数性をパラメータ化することも可能ですか?

些細で、ミニマリスト、テンプレート化されていない例:

struct Foo {
    Foo *       self()       { return this; }
    Foo const * self() const { return this; }
};

盲人テンプレート仮説

struct Foo {
    template<typename T> T self() std::constness_of(T) { return this; }
};

Answer #1

いいえ。しかし、回避策は単純明快で、おそらくもっと読みやすく、意図は明らかです。

struct Foo {
    template<typename T>
    std::enable_if_t<std::is_const<T>::value,T> self() const { return this; }
    template<typename T>
    std::enable_if_t<!std::is_const<T>::value,T> self() { return this; }
};




c++14