2017-02-20 3 views
0

아래 코드는 사용자 정의 호출 가능 개체 (이 경우 함수 포인터)에 매개 변수 팩을 전달합니다. 호출 가능 함수의 반환 값을 반환하는 C++ 11의 방법이 있습니까? 좀 더 구체적으로, raise 문에 return 문을 추가 할 수 있도록 raise()의 반환 형식을 추론 할 수 있기를 원합니다. 반환 형식 템플릿 매개 변수를 추가 할 수 있지만 템플릿 매개 변수 Func에서 반환 형식을 이미 알고 있어야합니까?일반 호출 가능 개체의 반환 값 전달

size_t example(const std::string& str) 
{ 
    return str.size(); 
} 

template <class Func> 
class signal 
{ 
public: 
    signal() 
    { 
    } 

    ~signal() 
    { 
    } 

    void attach(Func handler) 
    { 
     _handler = handler; 
    } 

    template <typename... T> 
    void raise(T&&... args) 
    { 
     auto val = _handler(std::forward<T>(args)...); 
     // How do I return this? 
    } 

private: 
    Func _handler; 
}; 

typedef size_t(*fcn)(const std::string&); 

int main() 
{ 
    signal<fcn> sig; 
    sig.attach(&example); 
    sig.raise("hello!"); 

    return 0; 
} 
+0

C++ 14 기능을 사용할 수 있습니까? – anderas

답변

4

여기는 decltype입니다.

template <typename... T> 
auto raise(T&&... args) -> 
    decltype(std::declval<Func&>()(std::forward<T>(args)...)) 
{ 
    return _handler(std::forward<T>(args)...); 
} 

decltype(expr)

expr의 유형을 제공합니다. 여기에 args이 필요합니다. Func은 다른 반환 유형을 가진 operator() 함수가 여러 개있는 functor 객체 일 수 있습니다. 어떤 오버로드가 사용되는지 결정하기 위해 인수 유형이 필요합니다.

+2

C++ 14에서는'-> decltype (auto)'를 사용할 수 있습니다. ... 또는 참조를 신경 쓰지 않는다면 (즉, * copy *로 괜찮습니다), 다음과 같이 쓸 수 있습니다 '-> 자동'. – Nawaz

+0

@Nawaz'auto raise (...) -> auto {'는 불필요하게 장황합니다. '자동 레이즈 (...) {'할 것입니다. – anderas

+0

@anderas : 물론. 그저 사소한 세부 사항이므로 간략하게 설명하겠습니다. – Nawaz