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
|
#include <string>
#include <map>
#include <iostream>
//addable
template <typename Type>
concept Addable =
requires(Type par)
{
++par; // `Type' variables must support
par++; // pre-/postfix increment
}
and requires(Type lhs, Type rhs) // and also addition
{
lhs + rhs;
};
//=
// typename Type::value_type;
//index
template <typename Type>
concept HasIndex =
requires(Type tp)
{
tp[0];
};
template <HasIndex Type>
auto idx(Type const &obj, size_t idx)
{
return obj[idx];
}
//=
template <typename Type>
concept HasStrIndex =
requires(Type tp)
{
tp[std::string{}];
};
template <HasStrIndex Type>
auto value(Type &obj, std::string const &key)
{
return obj[key];
}
using namespace std;
int main()
{
// idx(1, 2);
string str;
cout << idx(str, 1) << endl;
map<string, double> msd;
value(msd, "hi");
}
|