가, 사용에 대한 SFINAE 검사 어떤 유형 T
이 T()(0U, 0U)
또는 T()[0U][0U]
을 지원할 수있는 경우 "부분 특수화"하지만 "일부 주문 함수 오버로드".) 아닌가요?
T
이 두 가지 작업을 모두 지원하지 않는 경우이 방법이 작동합니다.
다음 당신을 줄 수있는 작업 예 (bar
대체 Eigen
)
#include <vector>
#include <iostream>
template <typename T>
auto foo (T & mat) -> decltype(mat[0U][0U], int())
{ return 1; }
template <typename T>
auto foo (T & mat) -> decltype(mat(0U, 0U), int())
{ return 2; }
struct bar
{
void operator() (std::size_t x, std::size_t y)
{ }
};
int main()
{
std::vector<std::vector<int>> m1;
bar m2;
std::cout << foo(m1) << std::endl; // print 1
std::cout << foo(m2) << std::endl; // print 2
}
둘 다 [0U][0U]
및 (0U, 0U)
이 (다음 예제 baz
참조)을 지원하는 템플릿 클래스로 작업해야하는 경우입니다 우선 하나 개의 버전 또는 또 다른 바람직한 버전에서 int
다른 버전에서 long
(예 :로)를 int
값을 전달하고 수신하는
S
예를 들어
#include <vector>
#include <iostream>
template <typename T>
auto foo (T & mat, long) -> decltype(mat[0U][0U], int())
{ return 1; }
template <typename T>
auto foo (T & mat, int) -> decltype(mat(0U, 0U), int())
{ return 2; }
template <typename T>
int foo (T & mat)
{ return foo(mat, 0); }
struct bar
{
void operator() (std::size_t x, std::size_t y)
{ }
};
struct baz
{
std::vector<std::vector<int>> m;
std::vector<int> & operator[] (std::size_t x)
{ return m[x]; }
int & operator() (std::size_t x, std::size_t y)
{ return m[x][y]; }
};
int main()
{
std::vector<std::vector<int>> m1;
bar m2;
baz m3;
std::cout << foo(m1) << std::endl; // print 1
std::cout << foo(m2) << std::endl; // print 2
std::cout << foo(m3) << std::endl; // print 2
}
** 부분 특수화에 대해 다음 코드를 EE! **이 우리가'벡터에 적용 할 때 그래서 내가 왜 첫 번째 템플릿 함수가 호출됩니다 이해하지 못하는 –
에 과부하가 간단 >'객체. 그것이 먼저 정의 되었기 때문입니까? 첫 번째 기능이 "보다 전문화 된"것 또는 "벡터"에 대한 것 같습니다 : 이것이 이유입니까? 어떤 규칙이 모호성을 해결합니까? –
RobertHannah89
당신이 쓴 것은 작동하는 것 같습니다. '벡터'에 세 번째 템플릿 함수를 작성했는데 3 가지 옵션 사이에서 올바르게 결정된 것 같습니다. 나는 그것이 어떻게 작동하는지 알지 못하고 이것을 사용하고 싶지 않고 어느 날 잘못 될 수 있습니다. –
RobertHannah89