File: compound.cc

package info (click to toggle)
c%2B%2B-annotations 11.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 11,244 kB
  • sloc: cpp: 21,698; makefile: 1,505; ansic: 165; sh: 121; perl: 90
file content (68 lines) | stat: -rw-r--r-- 1,214 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <string>
#include <iostream>
#include <concepts>
//#include <type_traits>

template<typename Compound, typename Specified>
struct isEqual
{
    enum { equal = false };
};

template<typename Specified>
struct isEqual<Specified, Specified>
{
    enum { equal = true };
};

template<typename Compound, typename Specified>
concept same = isEqual<Compound, Specified>::equal;

//////////////////////////////////


template <typename Type, typename Ret>
concept ReturnType =
    requires(Type par)
    {
        { par[0] } -> std::same_as<Ret>;     // par[..] returns a Ret

    // no type constraints:
//        { par } -> isEqual<Ret>::equal;      // par returns a Ret
//        { par << 1 } -> isEqual<decltype(par << 1), Ret>::equal;

//        { par } -> same<Ret>;
//        { par } noexcept;

         {++par};
        // same as:
        // ++par;
    };

///////////////////////////////

struct XX
{
    void operator++()
    {};

    std::string  operator[](int idx) const
    {
        return std::string{"a"};
    }
};

template <typename Type, typename Ret>
    requires ReturnType<Type, Ret>
Ret ret(Type tp)
{
    return tp[0];
}

using namespace std;


int main()
{
    ret<XX, string>(XX{});
}