2015-01-09 2 views
2

기본 생성자를 호출하여 클래스의 기본값을 반환하는 std::function<T(Variable nums of arguments)>에 대한 템플릿을 만들려고합니다. C++ 11 : 형식의 기본 생성자를 호출하기위한 가변성 람다 템플릿

나는이 시도 :

난 당신이 내 Image<T> 수업 시간에 예를 들어, 기본값 및 복잡한 기능을 필요로하는 곳에 경우에 사용하려는
template <class T,class... Args> inline std::function<T(Args...)> zero(){ 
    return [](Args...){ return T();}; 
} 

:

template <typename T> class Image{ 
    ... 
    void drawEachPixel(std::function<T(size_t,size_t)> func){ 
     forRange(x,w){ 
      forRange(y,h){ 
       this->setPixel(x,y,func(x,y)); 
      } 
     } 
    } 
    ... 
}; 

이 취소 그냥 전화 할 수있는 이미지 :

image.drawEachPixel(zero()); 

컴파일 할 때 오류가 발생합니다. no matching function for call to 'Image<unsigned char>::drawEachPixel(std::function<unsigned char()>)' ...

답변

6

명백한 템플릿 인수 목록없이 zero을 호출 할 수 없습니다. 템플릿 매개 변수를 가지고 있습니다 :

template <class T, class... Args> 
//  ^^^^^^^^^^^^^^^^^^^^^^ 
inline std::function<T(Args...)> zero() 

템플릿 인수는 추론 될 수 없으므로 템플릿 매개 변수는 해당 유형없이 유지됩니다.
는 대신, 변환 연산자 템플릿을 사용

struct Zero 
{ 
    template <typename T, typename... Args> 
    operator std::function<T(Args...)>() 
    { 
     return [] (Args...) { return T(); }; 
    } 
}; 

을 그리고 이전과 그것을 사용할 수 있습니다. Demo.