2010-04-13 5 views
3

내가 형 무효 (* FUNC) (T)와 FUNC의 인수 인수의 기능을 소요 펑터 F를 쓰고에서 const를 또는 const가 아닌 참조 형을 얻는다.는 특성

template<typename T> 
    void F(void (*func)(T), WhatTypeHere? arg) 
{ 
    func(arg); 
} 

그러면 functor F는 arg로 func를 호출합니다. 나는 F를 arg를 복사하지 말고 그냥 참조로 전달하기를 바란다. 그러나 나는 간단하기 때문에 T는 참조가 될 수있다 "(* FUNC) (T), T & (무효) 무효 F"를 쓸 수 없습니다.

T -> T& 
T& -> T& 
const T -> const T& 
const T& -> const T& 

나는 이런 식으로 뭔가 들고 오지 : 그래서 T의 적절한 참조 유형을 얻을 수있는 특성을 쓰기 위해 노력하고 있어요

에 대한 예를 들어 작동하지 않습니다

template<typename T> 
struct type_op 
{ 
typedef T& valid_ref_type; 
}; 

template<typename T> 
struct type_op<T&> 
{ 
typedef typename type_op<T>::valid_ref_type valid_ref_type; 
}; 

template<typename T> 
struct type_op<const T> 
{ 
typedef const T& valid_ref_type; 
}; 

template<typename T> 
struct type_op<const T&> 
{ 
typedef const T& valid_ref_type; 
}; 


template<typename T> 
    void F(void (*func)(T), typename type_op<T>::valid_ref_type arg) 
{ 
    func(arg); 
} 

void a(int x) { std::cout << x << std::endl; } 
F(&a, 7); 

주기 오류 : 인수 2를 통과 입력 유형 'INT'의 임시에서 '&을 int 형'의 const가 아닌 참조 무효 초기화 의 '무효 F (무효 (*) (T), 유형 이름 type_op :: valid_ref_type)와에게 T는 = INT]'

어떻게이 특성은 일하러 가야? 그런 다음 다음과 같이

template<typename T> struct remove_reference { typedef T type; }; 
template<typename T> struct remove_reference<T&> { typedef T type; }; 

다시 추가 :

는 는 는

다음과 같이 함수를 선언해야한다

remove_reference<T>::type& 
:

template<typename T> 
void F(void (*func)(T), const typename remove_reference<T>::type& arg) 
{ 
    func(arg); 
} 
+0

나는 이것과 꽤 비슷하다고 생각한다. http://stackoverflow.com/questions/2539361/c-template-functor-cannot-deduce-reference-type –

답변

5
template<class T> 
struct forwarding { typedef T const& type; }; 
template<class T> 
struct forwarding<T&> { typedef T& type; }; 

template<typename T> 
void F(void (*func)(T), typename forwarding<T>::type arg) { 
    func(arg); 
} 

void a(int x) { std::cout << x << std::endl; } 
int main() { 
    F(&a, 7); 
} 

당신의 매핑은 T가 T의 너무 CONST &에 매핑 당신이 실제로 원하는, 가까이!

void f(int const); 
typedef void F(int); // typedef of function type 
F* p = &f; // no error! f's signature doesn't include const 
+0

절대적으로 완벽한 솔루션입니다. 참조 인수에 대한 고정 호출도 있습니다. void a (int & x) {std :: cout << x << std :: endl; } – maciekp

2

당신이 필요로하는 참조를 제거하는 것입니다 내 마음에 막연한 조금,하지만 난 단지 const T& 특성을 제공하여 해당 부스트 (어쩌면 부스트 : : 바인드)이 해결 생각 비 const 참조를 나타내는 데 ref(x)을 사용해야하는 경우. 기능은 T의 서명이 T의 CONST의 매개 변수 유형을 갖는

 
T  -> T const& 
T&  -> T& 
T const& -> T const& 

참고 :

+1

당신의 특성과 같은 오류 : 'int'유형의 임시 'int'유형의 const 참조 또한 CONST INT의 전달 및 에러가 발생하는 CONST의 INT 및 CRI = 7; F (& a, cri); – maciekp

+0

@maciekp 고정 "타입"의 CONST INT '의 식에서 유형'및 INT '의 참조 잘못 초기화 ". –

+1

죄송합니다. const가 표시되지 않았습니다. 나를 위해 일한다! – maciekp

1

그것은이다

+0

불행히도, 나는 부스트를 사용할 수 없습니다. 그러나 당신의 대답은 틀림 없습니다. – maciekp

1

당신은 또한 당신이 필요로하는 유형 매핑을 달성하기 위해 Boost.TypeTraits에서 add_reference을 사용할 수 CONST는 구현 세부입니다.