我无法让这个工作。我希望它检查基本类型,但也检查基本类型的指针:
template<typename T> struct non_void_fundamental :
boost::integral_constant<bool,
(boost::is_fundamental<T>::value && !boost::is_same<T, void>::value)
|| (boost::is_fundamental<*T>::value && !boost::is_same<*T, void>::value)
>
{ };
也许有人可以帮我指出正确的方向。
编辑:特别是第4行没有做我想要的,其余的工作正常。
编辑2:关键在于它在以下示例中生成以下输出:
int* p = new int(23);
cout << non_void_fundamental<double>::value << endl // true
cout << non_void_fundamental<some_class>::value << endl // false
cout << non_void_fundamental<p>::value << endl // true
编辑3:感谢Kerrek SB,我知道这一点,但它产生了一些错误。
template<typename T> struct non_void_fundamental :
boost::integral_constant<bool,
(boost::is_fundamental<T>::value && !boost::is_same<T, void>::value)
|| (boost::is_pointer<T>::value && boost::is_fundamental<boost::remove_pointer<T>::type>::value && !boost::is_same<boost::remove_pointer<T>::type, void>::value)
>
{ };
Erros:
FILE:99:61: error: type/value mismatch at argument 1 in temp
late parameter list for 'template<class T> struct boost::is_fundamental'
FILE:99:61: error: expected a type, got 'boost::remove_poi
nter<T>::type'
FILE:99:125: error: type/value mismatch at argument 1 in tem
plate parameter list for 'template<class T, class U> struct boost::is_same'
FILE:99:125: error: expected a type, got 'boost::remove_po
inter<T>::type'
答案 0 :(得分:3)
你完全错了。让我们专注于“T
是指向基本类型的指针”:那就是:
T
是指针,
现在把它们放在一起吧。在伪代码中:
value = (is_fundamental<T>::value && !is_void<T>::value) ||
(is_pointer<T>::value && is_fundamental<remove_pointer<T>::type>::value)
在实际代码中,Boost版本:
#include <boost/type_traits.hpp>
template <typename T>
struct my_fundamental
{
static bool const value =
(boost::is_fundamental<T>::value && ! boost::is_void<T>::value) ||
(boost::is_pointer<T>::value &&
boost::is_fundamental<typename boost::remove_pointer<T>::type>::value);
};
在C ++ 11中,将包含更改为<type_traits>
,将boost::
更改为std::
。