제페 2020. 10. 20. 13:18
반응형

특정 함수 요구 샘플

#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;
}
반응형