2015-01-13 4 views
1

내가이 말 ID를 구별 할 수 고유 식별자를 생성 또는 각 회원에 대한 주소. 발전기의 스케치(푸 :: A()) ID에서 (푸 :: B())

#define BIND(foo) Generate<decltype(&foo), &foo>::call 

u = & BIND(S::f) 
v = & BIND(S::g) 
w = & BIND(S::h) 

BIND 연관된 C 스타일의 기능을 다음

를 생성한다 :

template< typename F f > 
struct Generate {} 

template < typename R, typename ...Arg, R(S::*target)(Arg...) > 
struct Generate< R(S::*)(Arg...),target > 
{ 
    static R call(PyObject* self, Arg... carg) 
    { 
     cout << ??? // the name, e.g. 'S::b' 

내가 사용하는거야 때문이다 이 함수를 생성 한 S::foo의 이름이 cout이 필요합니다.

질문의 두 번째 부분은 다음과 같습니다. call에서 동일한 UID를 복구하려면 어떻게해야합니까?

내가의 UID를 만들려고 해요 이유는 내가 할 수 있도록이다

static std::map<void*, std::string> names_map; 

그럼 난 내 수정할 수 있습니다

#define BIND(foo) Generate<decltype(&foo), &foo>::call; \ 
        names_map[ UID(foo) ] = std::string(#foo); 

    static R call(PyObject* self, Arg... carg) 
    { 
     cout << names_map[ UID( R(S::*target)(Arg...) ) ]; 

하지만 어떻게 실제로이 일을?

누구나 테스트 케이스를 만들었습니다. on coliru - 누구나 작동시킬 수 있습니까?

+0

http://stackoverflow.com/questions/543306/platform-independent-guid-generation-in-c – pm100

+0

uuid는 COM 세부 사항입니다. 유형에만 적용되고 기능에는 적용되지 않습니다. –

+0

@HansPassant, 잘못된 용어 사용에 나쁘다. 나는 그 질문에 대해 다시 말 하였다. –

답변

3

이것은 XY 문제처럼 들립니다. 실제로 필요한 것은 특정 유형 (Generate<...>)을지도의 키로 사용할 수있는 항목에 연결하는 방법입니다. 이를 수행하는 표준 방법은 std::type_index입니다.

static std::map<std::type_index, std::string> names_map; 

/* ... */ 

template <typename R, typename... Arg, R(Base::*target)(Arg...)> 
struct Generate< R(Base::*)(Arg...), target > 
{ 
    static void call() 
    { 
     std::cout << "TARG:" << names_map[ std::type_index(typeid(Generate)) ] << std::endl; 
    } 
}; 

#define BIND(fp, cxx_target) \ 
          fp = &Generate< decltype(&cxx_target), &cxx_target >::call; \ 
          names_map[ std::type_index(typeid(Generate< decltype(&cxx_target), &cxx_target >)) ] = std::string(#cxx_target); 

Demo.

+0

환상적입니다 - 고맙습니다! 방금 std :: type_index (typeid (decltype (x)))'- [here] (http://coliru.stacked-crooked.com/a/3495a0357ee659d5)를 사용하여 대칭으로 만들 수 있다는 것을 알았습니다 어떤 방법으로 #define을 개선 할 수 있습니까?) –

+0

@Pi Do not do - 멤버 함수에 대한 포인터의 * type *에 대한 인덱스입니다. 'TARG : Base :: f'를 인쇄 할 때 첫 번째 호출이'TARG : Base :: h'를 어떻게 출력하는지 주목하십시오. 내 대답의 코드는 'Generate <...>'유형에 대한 색인으로, 구성원 함수에 대한 포인터 유형과 * 값 *을 모두 포함합니다. –

+0

aiee. 게시하기 전에 출력물을 조사 했어야합니다. [고정] (http://coliru.stacked-crooked.com/a/a6dee3e43e3dd0f2). –