부스트가 아닌 솔루션에는 시스템 종속 코드 (부스트를 사용하는 경우 부스트에 숨겨진 )가 포함됩니다. 정확히 을 "일치"로 정의해야합니다 : "./MyFile.xxx"
과 "MyFile.xxx"
은 같아야합니까? "aaa/.../MyFile.xxx"
과 "MyFile.xxx"
은 어떨까요? 나는이 문제를 해결할 것
하는 방법은 두 가지 데이터 멤버, (항상 유닉스 빈 일 것)을 “ 접두사 ”과 std::string
및 경로 모든 요소를 가진 std::vector<std::string>
로 클래스를 정의하는 것입니다. 이 클래스는 필요한 비교 함수가 점으로 찍혀 있고 생성자를 구현하기 위해 시스템 종속 코드를 사용합니다. 생성자 자체는 소스 파일에 있고 소스 파일에는 컴퓨터 종속 헤더가 포함됩니다 (일반적으로 각 변형에 대해 별도의 디렉토리를 사용하고 은 -I
또는 /I
으로 헤더를 선택하여 사용할 디렉토리를 지정합니다).).헤더에 들어갈 수있는 것 의 종류 : 유닉스에 대한
inline bool
isPathSeparator(char ch)
{
return ch == '/';
}
std::string
getHeader(std::string const& fullPathName)
{
return "";
}
bool
charCompare(char lhs, char rhs)
{
return lhs < rhs;
}
bool
charMatch(char lhs, char rhs)
{
return lhs == rhs;
}
와 Windows 용
inline bool
isPathSeparator(char ch)
{
return ch == '/' || ch == '\\';
}
std::string
getHeader(std::string const& fullPathName)
{
return fullPathName.size() > 2 && fullPathName[1] == ':'
? fullPathName.substr(0, 2)
: std::string();
}
bool
charCompare(char lhs, char rhs)
{
return tolower((unsigned char)lhs) < tolower((unsigned char)rhs);
}
bool
charMatch(char lhs, char rhs)
{
return tolower((unsigned char)lhs) == tolower((unsigned char)rhs);
}
.
생성자는 다음 헤더를 초기화
getHeader
을 사용
및 요소들로 문자열을 깨는 input.begin() + header.size()
및 input.end()
이상 반복 할. "."
요소가있는 경우 을 무시하고 ".."
중 하나 인 경우 을 사용하여 경로가 비어 있지 않으면 경로의 상위 요소 인 을 제거하십시오. 그 후,이 charCompare
및 char
에 대한 charMatch
및 std::lexicographical_compare
또는 std::equal
를 사용하는 비교기를 정의 단지 질문입니다 (새 클래스 아마 또한 등) std::string
의 비교기와 (크기가 동일한 것을 확인 후) . 다음과 같이 입력하십시오 :
struct FileNameCompare
{
bool operator()(char lhs, char rhs) const
{
return charCompare(lhs, rhs);
}
bool operator()(std::string const& lhs, std::string const& rhs) const
{
return std::lexicographical_compare(
lhs.begin(), lhs.end(),
rhs.begin(), rhs.end(),
*this);
}
bool operator()(FileName const& lhs, FileName const& rhs) const
{
return (*this)(lhs.prefix, rhs.prefix)
|| (!(*this)(rhs.prefix, lhs.prefix)
&& std::lexicographical_compare(
lhs.elements.begin(), lhs.elements.end(),
rhs.elements.begin(), rhs.elements.end(),
*this));
}
};
struct FileNameMatch
{
bool operator()(char lhs, char rhs) const
{
return charMatch(lhs, rhs);
}
bool operator()(std::string const& lhs, std::string const& rhs) const
{
return lhs.size() == rhs.size()
&& std::equal(lhs.begin(), lhs.end(), rhs.begin(), *this);
}
bool operator()(FileName const& lhs, FileName const& rhs) const
{
return (*this)(lhs.prefix, rhs.prefix)
&& lhs.elements.size() == rhs.elements.size()
&& std::equal(lhs.elements.begin(), lhs.elements.end(),
rhs.elements.begin(),
*this);
}
};
트릭을해야합니다. (그냥 operator()(char, char) const
소스 파일에 있어야 기억, 당신은 charCompare
및 charMatch
를 정의하는 시스템에 의존 헤더를 포함하지 않습니다 헤더, 에서 그들을 인라인 수 없습니다.)
+1 좋은 질문입니다. 부스트 할 수있는 대안이 있습니까? – Walter
지금 헤더 전용 부스트를 사용하고 있는데, 왜 lib 의존성을 추가하지 않는 이유가 무엇입니까? –
@Tomalak Garet'kal : Sun Studio 5.7에서 컴파일 컴파일에 몇 가지 문제가 있기 때문에 –