C++11:用于调用类型的默认构造函数的可变参数 lambda 模板
C++11: variadic lambda template for calling the default constructor of a type
我想通过调用默认构造函数为 std::function<T(Variable nums of arguments)>
创建一个模板,returns 是 class 的默认值。
我试过这个:
template <class T,class... Args> inline std::function<T(Args...)> zero(){
return [](Args...){ return T();};
}
我想用在只需要默认值,不需要复杂功能的场合,比如我的Image<T>
class:
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()>)'
...
您不能在没有显式模板参数列表的情况下只调用 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.
我想通过调用默认构造函数为 std::function<T(Variable nums of arguments)>
创建一个模板,returns 是 class 的默认值。
我试过这个:
template <class T,class... Args> inline std::function<T(Args...)> zero(){
return [](Args...){ return T();};
}
我想用在只需要默认值,不需要复杂功能的场合,比如我的Image<T>
class:
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()>)'
...
您不能在没有显式模板参数列表的情况下只调用 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.