2015-01-09 82 views
2

我想为std::function<T(Variable nums of arguments)>创建一个模板,该模板通过调用默认构造函数来返回类的默认值。C++ 11:用于调用类型的默认构造函数的variadic lambda模板

我尝试这样做:

template <class T,class... Args> inline std::function<T(Args...)> zero(){ 
    return [](Args...){ return T();}; 
} 

我想用它的场合,你只需要默认值,并没有复杂的功能,比如在我Image<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

相关问题