mirror of
https://github.com/changkun/modern-cpp-tutorial.git
synced 2025-12-17 12:44:40 +03:00
see #1: concepts demo
This commit is contained in:
66
code/10/10.2.concepts.cpp
Normal file
66
code/10/10.2.concepts.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
using namespace std;
|
||||
|
||||
template<typename T>
|
||||
concept bool Stringable = requires(T a){
|
||||
{a.to_string()} -> string;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
concept bool HasStringFunc = requires(T a){
|
||||
{ to_string(a) } -> string;
|
||||
};
|
||||
|
||||
struct Person {
|
||||
double height, weight;
|
||||
Person(double a, double b) : height(a), weight(b) {}
|
||||
string to_string(){
|
||||
return "weight: "+ std::to_string(weight) + ", height: "+ std::to_string(height);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
namespace std {
|
||||
|
||||
string to_string(list<int> l){
|
||||
string s = "";
|
||||
for(int a : l ){
|
||||
s+=(" " + to_string(a) + " ");
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
string to_string(std::vector<int> v){
|
||||
string s = "";
|
||||
for(int a : v ){
|
||||
s += (" " + to_string(a) + " ");
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
void print(Stringable a){
|
||||
std::cout << a.to_string() << std::endl;
|
||||
}
|
||||
|
||||
void print(HasStringFunc a){
|
||||
std::cout << to_string(a) << std::endl;
|
||||
}
|
||||
|
||||
int main() {
|
||||
std::list<int> l {1, 2, 3};
|
||||
Person p(57, 170.0);
|
||||
std::vector<int> v { 34, 23, 34, 56, 78};
|
||||
|
||||
print(p); // uses concept Stringable
|
||||
print(l);
|
||||
print(3); // uses concept HasStringFunc
|
||||
// print(v); // error
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user