这是一个简化的例子,代码用于生成任意值的序列(在某种意义上std::iota)和不同类别的迭代器:
struct delta
{
template<typename I>
void inc(I& i) { ++i; }
template<typename I>
I next(I i) { inc(i); return i; }
};
Run Code Online (Sandbox Code Playgroud)
有许多类,如delta,每一个都限定inc不同,例如--i,i += step,i -= step,i *= step,f(i)等功能next保持不变,实际上是在基类共享.
我们正在next从变异操作中产生基于价值的操作inc.相反的做法是相同的,但是我们选择这种设计来提高性能,因为next只能在某些初始化时inc调用,而可能被称为一百万次.
问题是,如果某些参数是编译时常量,我想next在编译时调用给定一个constexpr参数i.
这在C++ 11中是不可能的,因为调用了非constexpr函数inc.只需改为
template<typename I>
constexpr I next(I i) { inc(i); return i; …Run Code Online (Sandbox Code Playgroud)