作为一个懒惰的开发者,我喜欢使用这个技巧来指定一个默认的功能:
template <class Type,unsigned int Size,class Function = std::less<Type> > void arrange(std::array<Type,Size> &x,Function&& f = Function()) { std::sort(std::begin(x),std::end(x),f); }
但是在一个非常特殊的情况下我有一个问题,这是以下几点:
template <class Type,class Function = /*SOMETHING 1*/> void index(std::array<Type,Function&& f = /*SOMETHING 2*/) { for (unsigned int i = 0; i < Size; ++i) { x[i] = f(i); } }
在这种情况下,我希望默认的函数是等价于:[](const unsigned int i){return i;}(一个刚刚返回传递值的函数).
为了做到这一点,我需要写什么代替* * SOMETHING 1 * /和/ * SOMETHING 2 * /?
解决方法
没有标准的函子做到这一点,但它很容易写(尽管确切的形式是为了一些争议):
struct identity { template<typename U> constexpr auto operator()(U&& v) const noexcept -> decltype(std::forward<U>(v)) { return std::forward<U>(v); } };
这可以使用如下:
template <class Type,std::size_t Size,class Function = identity> void index(std::array<Type,Function&& f = Function()) { for (unsigned int i = 0; i < Size; ++i) { x[i] = f(i); } }