C++ 0x에 가변 유효 템플릿의 매개 변수 팩에 특정 유형이 포함되어 있는지 확인하는 기본 제공 기능이 있는지 궁금합니다. 오늘날 boost ::: mpl :: contains는 boost :: mpl :: vector를 variadic 템플릿의 대체물로 사용하는 경우이를 수행하는 데 사용할 수 있습니다. 그러나 컴파일 시간에 심각한 오버 헤드가 있습니다. C++ 0x에는 std :: is_same에 대한 컴파일러 수준의 지원이 있다고 가정합니다. 그래서 아래의 일반화가 컴파일러에서도 지원된다고 생각하고있었습니다. 이 가변 인자 템플릿에 대해 하나 다른 고유 작업을하고C++ 0x 매개 변수 팩에 유형이 포함되어 있는지 확인하십시오.
#include <type_traits>
template < typename Tp, typename... List >
struct contains : std::true_type {};
template < typename Tp, typename Head, typename... Rest >
struct contains<Tp, Head, Rest...>
: std::conditional< std::is_same<Tp, Head>::value,
std::true_type,
contains<Tp, Rest...>
>::type {};
template < typename Tp >
struct contains<Tp> : std::false_type {};
즉이다 :
template <typename... Args, typename What>
struct is_present
{
enum { value = (What in Args...)? 1 : 0 };
};
언어/컴파일러가 sizeof .... (4 도트)보다 더 큰 내장 연산을 지원해야합니다. IMO는 크기를 찾는 것과 같이 "기본"이라고 판단합니다. mpl은 필자가 작성한이 테스트를 바탕으로 성능 오버 헤드가 있다고 생각합니다. http://www.dre.vanderbilt.edu/~sutambe/files/mpl_intersection.cpp MPL의 버전뿐만 아니라 손으로 코딩 한 교차 알고리즘을 사용하고 있습니다. g ++ 4.4는 둘 다 컴파일하는데 같은 시간이 걸립니다. Variadic 템플릿 버전은 10 배 빠르게 컴파일됩니다. BTW, 제발 mpl의 게으른 템플릿 인스턴스화 기술에 대한 독서 좀 제안 해 주시겠습니까? – Sumant
C++ Template Metaprogramming 서적에서 게으른 평가의 좋은 예를 발견했습니다. 그게 분명하지 않니?! 어쨌든 고마워. – Sumant
네가해야 할 일은 다른 중첩 메타 함수에 결과를주기 전에 메타 함수의 템플릿 인스턴스화 (중첩 된 유형 별명 유형을 표시하여)를 피하는 것입니다. 부스트 메타 함수는 메타 함수를 평가하도록 설계되었습니다 마지막 순간에 중첩 된 유형의 별칭이 필요합니다. 느린 작업도하도록 설계되었으므로 베어 값을 피하고 메타 데이터 유형 래퍼 (예 : mpl :: bool_)를 사용해야합니다. 가끔씩 boost mpl이 제공합니다. 두 가지 형태의 메타 함수는 게으른 인스턴스화를 촉진하는 것을 사용하려고 시도합니다. –