【问题标题】:How to use dependent template default parameter with member accesses如何在成员访问中使用依赖模板默认参数
【发布时间】: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&lt;float&gt;。除了模板参数,Handler 应该可以与float 一起使用。当然,如果我直接使用Handler&lt;float&gt; 甚至Handler&lt;float, 32&gt;(不需要的解决方案)我会得到error: ‘width’ is not a member of ‘float’。所以如果T 是float 和T::width 否则我需要代码能够使用常量值32。

我尝试在WIDTH 的默认参数中使用三元运算符,并使用std::is_same 和一个根据提供的类型计算宽度的特殊函数。两次尝试也会导致上述错误。

我还研究了模板专业化,但之后我还需要专门化 WIDTH,这将需要在之后提供(即Handler&lt;float, 32&gt;),不是吗?

我真的很感激一些提示/解决方案。

【问题讨论】:

  • 不是答案,但&lt;float, 32&gt; 对我有用。正如预期的那样,只是 &lt;float&gt; 没有。
  • @HolyBlackCat 哦,是的,确实适用于&lt;float, 32&gt;,你是对的。

标签: c++ c++11 templates


【解决方案1】:

您可以使用 trait 辅助类来解决这个问题。默认情况下它将使用::width,但可以专门用于其他类型:

template<typename T>
struct width_trait
{
    static unsigned const width = T::width;
};

template<>
struct width_trait<float>
{
    static unsigned const width = 32;
};

template <typename T, unsigned WIDTH=width_trait<T>::width>
struct Handler {
    static unsigned const width = WIDTH;
};

【讨论】:

    猜你喜欢
    • 2023-01-24
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多