如何在模板中限制类型名

ky

具有可以接受4种不同类型的功能。它们的实现非常相似。

template< typename T >
void foo( std::string &&name, T value ){
    //...
}

typename T必须是4种预定义类型之一。其他类型名称是不可接受的,并且应在编译时加以限制。
是否可以用C ++编写?

0

<type_traits>让您将逻辑概括为类模板。这是如何工作的,我们获取的模板参数T和参数包,Ts然后开始检查类型列表T是否相同Head如果找到匹配项,则我们继承std::true_type并完成。如果未找到匹配项,则弹出头部,并以的尾部递归实例化同一模板Ts最终,如果根本找不到匹配项,参数包大小将降至零,并且编译器将实例化从继承的基本模板类std::false_type观看视频,以取得更好的效果,并在Walter E. Brown先生的详细说明下进行观看

template<class T, class...> struct is_any_of: std::false_type{};
template<class T, class Head, class... Tail> 
struct is_any_of<T, Head, Tail...>: std::conditional_t<
  std::is_same<T, Head>::value, 
  std::true_type,
  is_any_of<T, Tail...>>
{};

现在,我们可以使用几乎英语的enable_if来完成SFINAE的工作

#include <type_traits>
#include <string>

template<
  class T,
  class = std::enable_if_t<is_any_of<T, int, float, unsigned, double>::value>
>
void foo(std::string &&str, T value) {}


int main()
{
  foo(std::string{"hello"}, 3);
  foo(std::string{"world"}, '0'); //compile-time error
}

SFANIE是一种语言功能,一种工具,使用或滥用了某些说法来实现您的要求,

标准库组件std :: enable_if允许创建替换失败,以便根据编译时评估的条件启用或禁用特定的重载。仅供参考http://en.cppreference.com/w/cpp/language/sfinae

请注意,std::conditional_t<>std::enable_if_t<>分别来自std::conditional<>::type和的简写形式std::enable_if<>::type您可以简单地在代码中替换它们,但应typename在此之前放置关键字enable_if

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章