具有可以接受4种不同类型的功能。它们的实现非常相似。
template< typename T >
void foo( std::string &&name, T value ){
//...
}
typename T
必须是4种预定义类型之一。其他类型名称是不可接受的,并且应在编译时加以限制。
是否可以用C ++编写?
<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] 删除。
我来说两句