2011-12-07 6 views
0

나는 다음과 같이 특정 클래스 내에서 다양한 멤버 함수에 액세스하는 데 사용할 수있는 멤버 함수에 "일반"포인터를 정의하기 위해 노력하고있어 :포인터 :: 변형

class Security{ 
    inline std::vector<double> member_function(const std::string &input_data_string){ return ... a vector<double>....;}; 
    }; 

I을 boost :: variant를 사용하여 "OTHER"함수에 액세스하는 데 사용할 수있는 멤버 함수에 대한 일반적인 포인터를 정의하고 있습니다.

cannot convert from 'std::vector<_Ty> (__thiscall Security::*)(const std::string &)' to 'boost::variant<T0_,T1,T2,T3> (__thiscall Security::*)(boost::variant<T0_,T1,T2,T3>)' 
1>   with 
1>   [ 
1>    _Ty=double 
1>   ] 
1>   and 
1>   [ 
1>    T0_=std::string, 
1>    T1=double, 
1>    T2=std::vector<double>, 
1>    T3=std::vector<std::string> 
1>   ] 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

당신은 나에게 내가 뭘하는지 파악하는 데 도움이 시겠어요 :

typedef boost::variant<std::string,double, std::vector<double>, std::vector<std::string>> (Security::*ptr_sec_fn)(boost::variant<std::string,double, std::vector<double>, std::vector<std::string>>); 

다음이 내가지고있어 오류입니다

ptr_sec_fn=&Security::member_function; 

멤버 함수 포인터를 할당 여기서 뭐라구? 정말 고맙습니다.

+1

대신에'boost :: function' 또는'std :: function'을 사용 해본 적이 있습니까? – AJG85

+0

또한 boost :: bind와 boost :: phoenix :: bind를 보자. – Smash

답변

0

이렇게하면 작동하지 않습니다. 어떤 사람은 벡터에서 변형 유형으로 변환해야하고, 함수는 그것을 수행 할 수 없습니다 (벡터를 반환하기 때문에 모든 것을 알 수 있습니다). 그리고 포인터를 작성하는 코드는이를 수행 할 수 없습니다 (왜냐하면 즉석에서 함수를 생성 할 수는 없습니다).

반면에 어쨌든 디자인을 다시 생각하고 싶을 수도 있습니다. 왜 그런 제네릭 함수 포인터가 필요합니까? 더 구체적으로 지정할 수 있습니까? 유형이 명확한 유형을 통해 좋은 디자인을 보여줍니다. 유형이 프로그래머가 어떤 문서보다 필요한 데이터를 정확히 표시하기 때문입니다.

+0

내가 전화를 할 때마다 다른 멤버 함수를 호출하고 싶을 때마다 포인터를 재정의하고 싶기 때문에 내가 이것을하고있다. 함수는 그 반환 유형을 알아.ptr_sec_fn = & (boost :: get > Security :: member_function) .. 이것이 유효한 구문인지 확실하지 않은 경우 어떻게해야합니까? ! –

0

Security::member_function의 유형은 할당하려고하는 포인터의 유형과 완전히 다른 std::vector<Ty> (_thiscall Security::*)(const std::string &)입니다. 허용되지 않습니다. 해당 변형을 가져 와서 반환하는 멤버 함수 만 해당 유형의 멤버 함수 포인터에 할당 할 수 있습니다.

이 할당이 작동하면 멤버 함수 포인터를 호출하려는 코드가 변형을 함수에 전달하고 함수가 문자열을 예상하기 때문에 함수가 손상됩니다. 누군가가 어떻게 든 변종에서 문자열을 가져와야한다는 것을 다른 사람이 알기에 충분한 정보가 어디에도 없습니다. 함수가 벡터를 반환 할 때 누군가가 벡터가 변형을 만드는 데 사용해야한다는 것을 알아야합니다. 호출 사이트에서이를 수행해야하지만 호출 사이트에서는 벡터가 반환되는지 알지 못합니다. 리턴되는 타입이 무엇인지를 아는 사실은 컴파일러가 알아야합니다. 그리고 형식을 알고 있다는 사실은 처음부터 포괄 형을 사용하면 안된다는 것을 나타냅니다. 올바른 유형을 사용해야합니다.

다른 형식을 사용하고 반환하는 오버로드 된 함수가 많은 경우 이러한 오버로드 중 하나를 가리킬 수있는 단일 멤버 함수 포인터를 가질 수 없습니다. 이 작업을 수행하려고하면 C++의 형식 안전이 완전히 무시됩니다. 그래서 당신은 당신이 원하는 것을 할 수있는 안전한 방법을 생각해야 할 것입니다.

우리는 목표를 달성하는 데 도움이되는 정보가 더 필요하지만 현재 시도하고있는 것은 결코 작동하지 않을 것입니다.