繁体   English   中英

如何将模板限制为特定类型?

[英]How do I restrict templates to specific types?

为了简单起见,假设我通常要在此处传递字符串和基本数据类型:

template <typename T>
void writeLine(const T &ob)
{
    std::cout << ob << std::endl;
}

在大多数情况下,我会传递std :: string,int,char,float等。但是要说我不希望它接受float。 在现实世界中,我可能不希望它接受某些类。

有没有办法限制模板类型接受的内容?

是的,您可以的,示例的最简单方法是在函数中放入static_assert

template <typename T>
void writeLine(const T &ob)
{
    static_assert(!std::is_same<T, float>::value, "You can't use floats here");
    std::cout << ob << std::endl;
}

如果您尝试将函数与浮点数一起使用,则会产生编译时错误。

另一个选项称为SFINAE ,用于在某些情况下使模板参数推导失败。

通常,您将std :: enable_if<type_traits>标头中的某些模板结合使用。 与SFINAE相同的东西看起来像:

template <typename T, typename std::enable_if<!std::is_same<T, float>::value, int>::type = 0>
void writeLine(const T &ob)
{
    std::cout << ob << std::endl;
}

让我们分解一下typename std::enable_if<!std::is_same<T, float>::value, int>::type

!std::is_same<T, float>::value是此处的条件,如果此条件为true,则此模板将具有::type ,否则将没有。

在条件之后,我们可以指定条件为true时想要的类型,在这种情况下,我们使用int 如果未指定,则默认为void

因此,只要我们不将浮点数传递给此模板,第二个模板参数将被推导为int = 0 如果我们通过浮点数,则推论将简单地失败,并且您将得到一个no matching function错误,将模板显示为推论失败的候选者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM