一些观察,没有特别的顺序。
(1)你标记了 C++11,所以不仅typedef
(更好,恕我直言)还有using
using data_t = ap_uint<72>;
(2) 你也可以“模板化”using
template <int I>
using data_t = ap_uint<I+3>;
(3)“这甚至有效吗?”
#define WIDTH 72
typedef ap_uint<WIDTH / 8> mask_t;
作品。
但是,鉴于您标记了 C++11,我建议您避免#define
使用constexpr
常量来代替
constexpr auto WIDTH = 72;
using mask_t = ap_uint<WIDTH / 8>;
(4)“是否可以在模板参数选择中定义一个功能或使用现有的功能”
在 C++11 之前,答案是:不。
但是你标记了 C++11 所以答案是:是的,但是函数必须是constexpr
一个
例子
constexpr int foo (int a)
{ return a+3; }
constexpt int bar = 42;
using data_t = ap_uint<foo(bar)>; // compile: foo(bar) is a constant expression
int baz = 42;
using data_t2 = ap_uint<foo(baz)>; // compilation error! baz isn't a constant
// expression so foo(baz) isn't
std::ceil()
( 5)std::log()
并非constexpr
如此
#define SIZE 1024
typedef ap_uint<ceil(log(SIZE, 2))> addr_t;
不编译
(6) “如果可能的话,我可以自己编写函数。”
从 C++11 开始,这是可能的(参见第 (4) 点的示例)。
不幸的是,只有从 C++14 开始,才有可能编写复杂的constexpr
函数。
在 C++11 中,一个constexpr
函数几乎只能包含(简化一点)一条return
指令。