none
C++20 std::common_comparison_category について RRS feed

  • 質問

  • お世話になっております。

    よろしくお願い致します。

    C++17, C++20 を学んでいます。

    std::common_comparison_category というクラステンプレートが対応されたとのことで

    これについて調べてますが、templateクラス等に疎いため、

    std::common_comparison_category

    の使い方がいまいちわかりません。

    サンプルコードもネット上で見つからず。

    お手数をおかけいたしますが、ご教授お願い致します。

    2019年10月23日 2:34

回答

  • coco2014さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    >C++20 std::common_comparison_category について
    →compareに関するデモがあります。下記のリンクをご参照いただければと思います:
    https://github.com/microsoft/STL/blob/master/stl/inc/compare

    オペレーター<=>の詳細については、下記のリンクをご参照ください:

    https://brevzin.github.io/c++/2019/07/28/comparisons-cpp20/

    http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク coco2014 2019年12月6日 0:46
    2019年10月30日 8:23
    モデレータ

すべての返信

  • spaceship operatorがstrong_orderingを返すクラスを格納する時はweak_orderingに比べてもっと効率的な格納をするContainerを書いてみたい、というような話でしょうか

    jzkey


    • 編集済み jzkey 2019年10月23日 4:34 hashは違ってそうなので
    2019年10月23日 4:30
  • 回答ありがとうございます。

    std::common_comparison_category の説明を読んでもよくわからなく。
    自分なりに解釈したのが、std::strong_orderingを返す <=> operatorが
    実装されているクラスに対して、std::common_comparison_category を使うことによって
    (どのように使うかは不明)
    <=>の戻り値の型が何か判別できるものかと解釈しました。
    (おそらくだいぶ勘違いしていると思われます…))

    なので以下のようなクラスを定義した場合
    class cl_strong_ordering {
    	int x;
    	int y;
    public:
    	std::strong_ordering operator<=>(const cl_strong_ordering&) const = default;
    };
    
    class cl_weak_equality {
    	int x;
    	int y;
    public:
    	std::weak_equality operator<=>(const cl_weak_equality&) const = default;
    };

    std::common_comparison_category を使って
    cl_strong_ordering のクラスの場合は std::strong_ordering を返す <=> が実装されている
    cl_weak_equality のクラスの場合は std::weak_equality を返す <=> が実装されている
    と判断できるのかと。。。

    それはどのように実装すればよいのかわからないといったところです。

    不明だらけで申し訳ございませんが、何かしらサンプルのプログラム例を見れば
    わかると思うのですが。よろしくお願い致します。
    2019年10月23日 7:05
  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1614r0.html
    たとえば、std::pairのstarship operatorの戻り型を決定するのに使われていますね。
    pairのstarship operatorは、TとUに移譲されますのでTとUのそれぞれの戻りの緩い方にならざるを得ません。

    jzkey

    2019年10月23日 7:57
  • ご回答ありがとうございます。

    このようには使えないんですね…。

    先ほどのクラスと合わせて。

    int main(void)
    {
    	std::cout << std::boolalpha;
    	std::cout << "cl_weak_equality == weak_equality ? : " << std::is_same<common_comparison_category< cl_weak_equality>::type, std::weak_equality>::value << std::endl;
    	std::cout << "cl_weak_equality == strong_equality ? : " << std::is_same<common_comparison_category< cl_weak_equality>::type, std::strong_equality>::value << std::endl;
    	std::cout << "cl_weak_equality == partial_ordering ? : " << std::is_same<common_comparison_category< cl_weak_equality>::type, std::partial_ordering>::value << std::endl;
    	std::cout << "cl_weak_equality == weak_ordering ? : " << std::is_same<common_comparison_category< cl_weak_equality>::type, std::weak_ordering>::value << std::endl;
    	std::cout << "cl_weak_equality == strong_ordering ? : " << std::is_same<common_comparison_category< cl_weak_equality>::type, std::strong_ordering>::value << std::endl;
    
        return 0;
    }

    これの結果は全てfalseです。

    このような使い方(型が判断できるのかなと。)を想定していたんですが。

    さすがに無理なコードでしたね。。。

    C++20で使える機能の調査をしているので。

    簡単にこの機能をどう使うかわかれば、有効な機能かなと思ったのですが。

    難しいですね。。。


    • 編集済み coco2014 2019年10月23日 8:42
    2019年10月23日 8:39
  • coco2014さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    >C++20 std::common_comparison_category について
    →compareに関するデモがあります。下記のリンクをご参照いただければと思います:
    https://github.com/microsoft/STL/blob/master/stl/inc/compare

    オペレーター<=>の詳細については、下記のリンクをご参照ください:

    https://brevzin.github.io/c++/2019/07/28/comparisons-cpp20/

    http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク coco2014 2019年12月6日 0:46
    2019年10月30日 8:23
    モデレータ