특정 함수 요구 샘플
#include <concepts>
#include <type_traits>
#include <fstream>
template < typename T >
concept Serializable = requires(T v, std::ostream & is)
{
v.Serialize(is);
};
template < typename T >
concept Deserializable = requires(T v, std::istream & is)
{
v.Deserialize(is);
};
template < typename T >
concept Convertable = Serializable<T> && Deserializable<T>;
template < Serializable T >
void Serialize(T& v)
{
}
template < Deserializable T >
void Deserialize(T& v)
{
}
template < Convertable T >
void Convert(T& v)
{
}
class Foo_Serialize_Only
{
public:
void Serialize(std::ostream& stream)
{
}
};
class Bar_Deserialize_Only
{
public:
void Deserialize(std::istream& stream)
{
}
};
class Qux_Both
{
public:
void Serialize(std::ostream& stream)
{
}
void Deserialize(std::istream& stream)
{
}
};
int main()
{
Foo_Serialize_Only foo;
Serialize(foo);
//Deserialize(foo); // 에러
//Convert(foo); // 에러
Bar_Deserialize_Only bar;
//Serialize(bar); // 에러
Deserialize(bar);
//Convert(bar); // 에러
Qux_Both qux;
Serialize(qux);
Deserialize(qux);
Convert(qux);
return 0;
}
특정 서브클래스 요구 샘플
#include <concepts>
#include <type_traits>
class Foo
{
public:
};
template < typename T >
concept SubclassOfFoo = std::is_base_of_v<Foo, T>;
class Boo
{
public:
};
class Coo : public Boo
{
public:
};
class Bar : public Foo
{
public:
};
template < SubclassOfFoo T >
void Perform(T& v)
{
}
int main()
{
// ok
Foo foo;
Perform(foo);
// ok
Bar bar;
Perform(bar);
// Boo는 안 된다.
Boo boo;
Perform(boo);
// Coo도 안 된다.
Coo coo;
Perform(coo);
return 0;
}