2

나는 여기에서 희망을 가지지 만, 나는 그 질문에 관해 정확하게 싶다. 이름만으로 구성원 템플릿을 감지하는 구현을 향상시키고 싶지만 장애물이 있습니다. 오버로드 된 static/static 멤버 함수를 감지 할 수있는 방법을 찾을 수 없습니다. 이 질문의 매우 중요한 부분은 어떤 이름을 감지했기 때문에 this trick을 사용할 수 없다는 것입니다. (나는 현재 구현에서 이미 사용하고 있습니다.) 유용하지 않은 유형을 지정할 수 없습니다. 이름 만 사용하는 것.이름으로 만 과부하 된 멤버 함수를 감지하는 방법이 있습니까? (이름을 알아 내지 않기 위해)

참조 할 내용은 내 other question을 참조하십시오. 현재 has_member_template_bar 구현을 an answer으로 게시했습니다. 나는이 질문에 모든 것을 게시해야한다고 생각하지 않는다.

질문은 동일하게 유지됩니다. - 인수를 지정하지 않거나 언급 된 트릭을 사용하지 않고 오버로드 된 멤버 함수를 감지 할 수 있습니까? 나는 아마도 내가 불가능할 것을 요구하고있는 것을 안다. 그러나 그것은 결코 묻지 않을 것이다.

+0

흥미로운 질문을, 그 할 수있는 방법을 찾을 재미 있었다. +1 – skypjack

답변

1

질문이 동일하게 유지됩니다. - 인수를 지정하지 않거나 언급 된 트릭을 사용하지 않고 오버로드 된 멤버 함수를 감지 할 수 있습니까? 나는 어쩌면 불가능을 요구하고 있을지도 모른다. 그러나 묻는 것은 결코 아프지 않다.

실제로, 불가능하지 않다.
그것은 최소한의 작업 예를 들어 다음과 같습니다

template<typename T, typename R, typename... A> 
void proto(R(T::*)(A...)); 

template<typename, typename = void> 
constexpr bool has_single_f = false; 

template<typename T> 
constexpr bool has_single_f<T, decltype(proto(&T::f))> = true; 

struct S { 
    void f(int) {} 
    void f(char) {} 
}; 

struct U { 
    void f() {} 
}; 

int main() { 
    static_assert(not has_single_f<S>, "!"); 
    static_assert(has_single_f<U>, "!"); 
} 

은 물론, 당신은 구성원 방법과 데이터 멤버를 구분하기 위해 더 많은 물건을 추가 할 필요를하지만 (헤더 type_traits 참조)을 추가하는 사소한 내가 시도 예제를 가능한 한 최소로 유지합니다.

기본 아이디어는 주어진 함수가 오버로드 된 경우 proto에 대한 호출이 실패하는 것입니다. 모호한 호출입니다.
어쨌든, SFINAE 규칙 때문에 오류가 삭제됩니다.
요청한대로 인수를 지정할 필요가 없습니다.
또한 proto을 정의 할 필요는 없지만 반환 유형은 void이어야합니다. 그렇지 않으면 다음과 같이 약간 decltype에 전화를 수정해야합니다 : 당신이 예제 코드에서 볼 수 있듯이, static_assertfS에 과부하가되어 있는지 확인

template<typename T> 
constexpr bool has_single_f<T, decltype(proto(&T::f), void())> = true; 

과는 U에 있지 않습니다.


위 예제는 C++ 14 이후 언어의 일부인 템플릿 변수를 기반으로합니다. 당신이 C++ (11)와 함께 작동 잘 알려진 구조체 기반 솔루션을 선호하는 경우
, 당신은 다음과 같은 검출기 사용할 수 있습니다

#include<type_traits> 

//... 

template<typename, typename = void> 
struct has_single_f: std::false_type {}; 

template<typename T> 
struct has_single_f<T, decltype(proto(&T::f))>: std::true_type {}; 

//... 

int main() { 
    static_assert(not has_single_f<S>::value, "!"); 
    static_assert(has_single_f<U>::value, "!"); 
} 
+1

나는 템플릿으로는 아무 것도 없다고 생각하기 시작했다 :). 좋은 대답! – xinaiz

+0

@BlackMoses 환영합니다. 이것은 까다 롭고 좋은 질문이었습니다. – skypjack

관련 문제