【发布时间】:2021-10-31 14:54:16
【问题描述】:
我不知道如何解决一个问题,可以用以下struct说明:
template <typename T, unsigned WIDTH=T::width>
struct Handler {
static unsigned const width = WIDTH;
};
有一个struct(在本例中称为Handler),它采用T 类型作为模板参数。在使用struct 的代码库中,使用了具有成员width(该类型的位数)的特殊二进制类型。由于这个Handler 应该只适用于该二进制类型,因此第二个参数WIDTH 的默认值是T::width。请注意,其中包含更多代码,但上面的代码仅提供简短说明。
现在我希望能够在此Handler 中允许floats,并将WIDTH 设置为32 作为默认参数,以便我可以使用Handler<float>。除了模板参数,Handler 应该可以与float 一起使用。当然,如果我直接使用Handler<float> 甚至Handler<float, 32>(不需要的解决方案)我会得到error: ‘width’ is not a member of ‘float’。所以如果T 是float 和T::width 否则我需要代码能够使用常量值32。
我尝试在WIDTH 的默认参数中使用三元运算符,并使用std::is_same 和一个根据提供的类型计算宽度的特殊函数。两次尝试也会导致上述错误。
我还研究了模板专业化,但之后我还需要专门化 WIDTH,这将需要在之后提供(即Handler<float, 32>),不是吗?
我真的很感激一些提示/解决方案。
【问题讨论】:
-
不是答案,但
<float, 32>对我有用。正如预期的那样,只是<float>没有。 -
@HolyBlackCat 哦,是的,确实适用于
<float, 32>,你是对的。