This feels unnecessarily restrictive to me. Do you know if there exists a reasonable workaround instead of writing the same complicated type over and over again?
당신은 템플릿 매개 변수로 그 유형을 전달하는 또 다른 개념에 대한 제약 조건의 이행을 연기 할 수 있습니다
template<typename Cont, typename It, typename Value>
concept bool InsertableWith = requires(Cont cont, It it, Value value) {
// use It and Value as much as necessary
cont.insert(it, std::move(value));
};
template<typename Cont>
concept bool Insertable = requires {
// optional
typename Cont::const_iterator;
typename Cont::value_type;
} && InsertableWith<Cont, typename Cont::const_iterator, typename Cont::value_type>;
당신이 그 일을 고려하는 경우에, 나는 당신이하기 전에 간단한 예제에 그것을 시도 제안 결정. 개념과 제약 조건을 작성하는 방법은 컴파일러가 오류를보고하는 방법을 결정하며 물론 오류가 발생하는 것은 개념을 유용하게 만드는 요소의 큰 부분입니다. 오류를 쉽게 이해할 수 있도록하면서 개념을 쉽게 작성하는 것은 내가 가볍게 받아 들일 절충안이 아닙니다.
예를 들어, 내가 명시 적 제한으로 typename Cont::const_iterator;
을 중복 적으로 추가 한 이유입니다. 이렇게하면 컴파일러는이 유형 요구 사항을보고 할 수 있습니다. 또한 개념 이름으로 InsertableWith
을 선택하는 데주의를 기울였습니다. detail::Insertable
으로 쉽게 이동할 수 있었지만 Insertable
과 detail::Insertable
과 관련된 오류가 더 혼란 스러울 수있었습니다.
마지막으로이 모든 것은 컴파일러의 구현 품질에 따라 달라 지므로 당분간은 어떤 접근 방식도 확실하지 않다고 생각합니다. 이 Coliru demo을 가지고 노는 것이 좋습니다.
'typedef V T;'를 사용하면 'T'에서 'V'로 별칭을 지정하는 것처럼 보입니다. 'using'은 네임 스페이스 또는 네임 스페이스의 특정 식별자를 호출하는 데 사용됩니다. 여기 예가 있습니다 : http://stackoverflow.com/questions/10103453/is-typedef-inside-of-a-function-body-a-bad-programming-practice –
@JamesMurphy 죄송하지만, C++ 11부터 'typedef'를 사용하여 이전처럼했던'alias '를 표현하기 위해'using' 키워드를 사용하십시오. 다음은 참조입니다 : http://en.cppreference.com/w/cpp/language/type_alias. – erikzenker
@JamesMurphy 예제는 기본적으로 같은 오류 메시지와 함께 typedef와 함께 실패합니다. erikzenker가 말했듯이, 구문은 요즘과 동일해야합니다. – Slizzered