2011-01-10 3 views
0

의 결과 유형을 가져옵니다내가로 선언 된 템플릿 기능을 전문으로하고자하는 기능

#define SPECIALIZE_READ(read_function) \ 
    template<> boost::function_traits<read_function>::result_type read(std::istream& is) { \ 
     return read_function(is); \ 
    } 
:
SPECIALIZE_READ(read_integer) 

그래서 내가 부스트 :: function_traits의 길을 갈과 같은 SPECIALIZE_READ를 선언 거라고 생각 : 읽기의 전문화로 간단 그래서 지금은 매크로를 수행하고 싶습니다

하지만 VC++ (2008) 컴파일러는 'boost :: function_traits': 'read_integer'가 'Function'매개 변수의 유효한 템플릿 유형 인수가 아닙니다.

아이디어가 있습니까?

+0

:

가장 쉬운 방법은 반환 형식의 중복을 허용하는 것입니다. C++ 03에서는 그렇게 작동하지 않습니다. C++ 0x에서는 decltype (read_function)을 사용할 수 있습니다. – ltjax

+0

그래? 내가 또 뭘해야하지? 나는 과거에 클래스 메소드와 함께 function_traits를 성공적으로 사용했고, 함수에도이 함수를 사용했지만이 경우에는 작동하지 않는 이유를 모른다. – Robert

답변

0

필자가 아는 바로는 동일한 함수 포인터를 매개 변수로 전달하지 않고 함수 포인터에서 반환 형식을 얻기위한 메커니즘 (C++ 0x에서는 decltype 제외)이 없습니다. 당신이 유형으로 값 (read_function)을 통과하기 때문에입니다

#define SPECIALIZE_READ(type, read_function) \ 
    template<> type read(std::istream& is) { \ 
     return read_function(is); \ 
    } 

SPECIALIZE_READ(int, read_integer) 
+0

예, 이것이 내 계획 B였습니다. "깔끔한"것은 아닙니다. – Robert

0

어쩌면 내가 틀렸을 수도 있지만, C++ 프로그래밍 사업자가 경험 한 바를 잘 기억한다면 함수는 반환 유형 만 다를 경우 오버로드되지 않을 수 있습니다. 당신이 이것을 할 경우 물건이 맞을 것 같아요 :

template<typename Type> void read(std::istream& is, Type& objectToRead); 

그리고 유형으로 인수를 사용하십시오. 이것은 컴파일러가 일반적으로 C++ 이름을 꾸미는 방식과 관련이 있습니다.

+0

실제로 함수 템플릿은 다음을 기반으로 오버로드된다. 리턴 유형에서 매우 자주 사용됩니다 (예 : 리턴 유형에서 enable_if 관용구 사용). – ltjax

+0

예, 과부하에는 문제가 없습니다. 간단하게 사용하려면 을 읽고 등을 읽으십시오. 문제는 boost :: function_traits가 전달하는 정적 함수를 인식하지 못하는 것 같습니다 ... – Robert

+0

반환 형식의 오버로드는 템플릿이 아닌 함수의 경우 문제가됩니다.이 경우에는 메서드가 남아 있지 않기 때문에 올바른 것을 선택하십시오. 템플릿 함수를 사용하면 적합한 인스턴스를 선택할 수 있습니다 (예 :'read '- 과부하 해결 필요 없음) – MSalters

관련 문제