나는 getVector
멤버 함수를 전문으로하고 싶습니다. 이것을 위해 SFINAE를 사용하려고합니다. Dim이 3 이상인 경우에만 작동합니다.SFINAE 템플릿 멤버 오버로드
template <size_t Dim>
class Mat
{
...
template <size_t VDim, typename enable_if<(Dim > 1 && VDim == 0)>::type* = nullptr>
void getVectorBegin(const array<size_t, Dim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<(Dim > 2 && 0 < VDim && VDim < Dim-1)>::type* = nullptr>
void getVectorBegin(const array<size_t, VDim>& indexBefore, const array<size_t, Dim - VDim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<(Dim > 1 && VDim == Dim-1)>::type* = nullptr>
void getVectorBegin(const array<size_t, Dim - 1>& indexBefore) const;
};
Mat<3> m;
Mat<2> m; // error C2039: 'type': is not a member of 'std::enable_if<false,_Ty>'
"Dim> x"수표를 마지막 && 용어로 사용 해보려고 시도 했습니까?나는 컴파일러가 옳은지 확실하지 않거나 단지 정의 된 구현이지만, enable_if 조건을 shortcircuit하고 VDim에 종속되지 않는 값을 고려할 수 있으므로 멤버 선언 인스턴스 생성 중에 컴파일러 오류가 발생합니다 (Mat <2>). 인스턴스 포인트) –
우리에게 보여주지 않는 것이 있습니다. 템플릿 클래스의 멤버 함수는 사용되지 않으면 인스턴스화되지 않습니다. 전화 사이트를 보여 주시겠습니까? – papagaga
@papagaga가 완전히 올바르지 않은 경우 클래스 템플릿이있을 때 멤버 함수 선언 (정의가 아닌)이 인스턴스화됩니다. 따라서 선언에 클래스 템플릿 매개 변수에 값 전용 * 전용 *이있는 표현식이 포함되어 있고 해당 표현식 결과가 잘못 작성되면 함수가 "사용되지"않은 경우에도 오류가 발생합니다 ... –