std :: enable_if过滤出char *类型的参数 [英] std::enable_if to filter out the argument with the type of char*

查看:97
本文介绍了std :: enable_if过滤出char *类型的参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么 char * pstr ="hello";pushArg(pstr); 仍会调用此类模板吗?

Why char* pstr="hello"; pushArg(pstr); still invoke such template?

您看到已经有&(!std :: is_same< char,类型名std :: remove_cv_t< std :: remove_pointer_t< T>>>> ::: value).

template <typename T, 
          typename std::enable_if<(!std::is_same<lua_CFunction, T*>::value)
                               &&   std::is_pointer<T>::value
                               && (!std::is_same<std::string*, T>::value)
                               && (!std::is_same<char, typename std::remove_cv<std::remove_pointer<T>>>::value)
                               && (!std::is_same<unsigned char, typename std::remove_cv<std::remove_pointer<T>>>::value)
int pushArg(T& val)
{

}   

推荐答案

首先,您已经用 C ++ 11 标记了答案,但是使用了 std :: remove_cv_t 来自C ++ 14.

First, you have tagged your answer with C++11 but you use std::remove_cv_t from C++14.

在C ++ 17中,您的函数应如下所示:

In C++17, your function would look like this:

template <typename T, 
          std::enable_if_t<
            std::is_pointer_v< T >
            && !std::is_same_v< std::string* , T >
            && !std::is_same_v< char         , typename std::remove_cv_t<std::remove_pointer_t<T>> >
            && !std::is_same_v< unsigned char, typename std::remove_cv_t<std::remove_pointer_t<T>> >,
            void
          >* = nullptr
         >
int pushArg(T& val) {
    return 0;
} 

,如果传递 char * pstr ="hello" ,则会引发错误.

and the error will be thrown in case of passing char *pstr = "hello".

在C ++ 11中,您缺少 typename std :: remove_cv< typename std :: remove_pointer< T> :: type> :: type 部分.完整代码如下:

And in C++11, you are missing typename std::remove_cv<typename std::remove_pointer<T>::type>::type part. Full code below:

template <typename T, 
          typename std::enable_if<
            std::is_pointer< T >::value
            && !std::is_same< std::string* , T >::value
            && !std::is_same< char         , typename std::remove_cv<typename std::remove_pointer<T>::type>::type >::value
            && !std::is_same< unsigned char, typename std::remove_cv<typename std::remove_pointer<T>::type>::type >::value,
            void
          >::type* = nullptr
         >
int pushArg(T& val) {
    return 0;
}

演示

这篇关于std :: enable_if过滤出char *类型的参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆