这是一个简化的示例代码,用于生成任意值序列(类似于
有许多类似于
但这段代码重复太多,因为有很多类似于
我看到
所以:
std::iota
)和不同类型迭代器。struct delta
{
template<typename I>
void inc(I& i) { ++i; }
template<typename I>
I next(I i) { inc(i); return i; }
};
有许多类似于
delta
的类,每个都以不同的方式定义inc
,例如--i
,i += step
,i -= step
,i *= step
,f(i)
等。函数next
保持不变,并且实际上在基类中共享。
我们正在从inc
的突变操作生成基于值的next
操作。反之亦然是等效的,但是我们选择这种设计是为了性能,因为预计只会在某些初始化时调用next
,而可以调用inc
一百万次。
问题在于,如果有些参数是编译时常量,则我想在给定constexpr
参数i
的情况下在编译时调用next
。
这在C++11中是不可能的,因为调用了非constexpr
函数inc
。简单更改为
template<typename I>
constexpr I next(I i) { inc(i); return i; }
或者
template<typename I>
constexpr I next(I i) { return inc(i), i; }
这样做是行不通的。当然,我们可以提供另一个特殊函数,例如
template<typename I>
constexpr I next(I i) { return i + 1; }
但这段代码重复太多,因为有很多类似于
delta
和许多其他操作,如inc/next
。我看到
constexpr
函数在C ++14中限制会放宽, 但我现在还无法实践实现它。所以:
- 最终C ++14会起作用吗?
- 标准化的状态是什么?
- 编译器的状态是什么?
- 有任何可能的解决方法吗?
编辑
看来inc
也应该是constexpr
(虽然是void
)。 这在clang 3.4上有效:
struct delta
{
template<typename I>
constexpr void inc(I& i) { ++i; }
template<typename I>
constexpr I next(I i) { inc(i); return i; }
};
但在gcc 4.8.2上不能运行。那么上面的代码是否正确的C++14?这只是gcc需要时间吗?