: 예를 들어, Is it possible to write a template to check for a function's existence?(과부하) 멤버 함수의 존재를 확인
는하지만 기능이 과부하되는 경우이 방법이 실패합니다. 그 질문의 최상위 답변에서 약간 수정 된 코드입니다.
#include <iostream>
#include <vector>
struct Hello
{
int helloworld(int x) { return 0; }
int helloworld(std::vector<int> x) { return 0; }
};
struct Generic {};
// SFINAE test
template <typename T>
class has_helloworld
{
typedef char one;
typedef long two;
template <typename C> static one test(decltype(&C::helloworld)) ;
template <typename C> static two test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};
int
main(int argc, char *argv[])
{
std::cout << has_helloworld<Hello>::value << std::endl;
std::cout << has_helloworld<Generic>::value << std::endl;
return 0;
}
이 코드를 출력합니다 :
0
0
그러나 :
1
0
두 번째 helloworld()
이 주석합니다.
내 질문은 그것이 오버로드 여부에 관계없이 멤버 함수가 있는지 여부를 확인할 수 있는지 여부입니다.
당신이 알고 싶은 수행합니다 SFINAE-수 맥락에서, 예를 들면 : 적절하게 호출 할 수있는 등의 구성원이있는 경우
그런 다음 확인하려면이 형식을 사용하십시오 특정 매개 변수로 호출 된 경우 함수가 존재합니다 *? 어떤 컴파일러를 지원해야합니까? 어떤 표준 버전입니까? – Yakk
모든 매개 변수가 있는지 확인하는 것으로 충분합니다. 저는 C++ 11에 만족 합니다만 가능한 한 많은 컴파일러를 지원하고 싶습니다. – foxcub
컴파일러에 관해서, 필자는 주어진 코드가 Clang 3.5.1에서'0 0'을 컴파일하고 출력하지만 GCC 4.9.2에서는 컴파일되지 않는다는 것을 알아 챘습니다. – foxcub