如何使用boost is_class来确定对象是否为类

How to use boost is_class to determine if an object is a class?

本文关键字:对象 是否 boost 何使用 is class      更新时间:2023-10-16

对于以下代码:

template<class _InIt,
class _Ty,
class _Fn2> inline
_Ty accumulateSimplePtr(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
{   // return sum of _Val and all in [_First, _Last), using _Func
for (; _First != _Last; ++_First)
{
    if(is_class<std::iterator_traits<_InIt>::value_type>::value)
        _Val = _Func(_Val, (*_First)());
    else
        _Val=_Func(_Val, *_First);
}
            return (_Val);
}

我如何判断_InIt是一个指向类/结构的interator还是指向像double这样的pod?

如果它指向一个双精度,我想使用*_First来获取数据,如果它指向某个类,我会使用(*_First)()来获取实际数据(假设该类有一个重载的运算符())。

我尝试了上面的方法,但它无法用"_Val=_Func(_Val,*_First);"行编译,并表示MyObj不能转换为double。

#include <iostream>
#include <type_traits>
#include <vector>
class A
{
public:
    int a;
    int b;
};
template<typename T>
struct IsClass
{
    enum { Yes = std::is_class<T>::value };
    enum { No = !Yes };
};
int main(int argc, char* argv[])
{
    std::vector<int> v1;
    std::vector<A> v2;
    auto it1 = v1.begin();
    auto it2 = v2.begin();
    std::cout << IsClass<std::decay<decltype(it1)>::type::value_type>::Yes << std::endl;
    std::cout << IsClass<std::decay<decltype(it2)>::type::value_type>::Yes << std::endl;
    std::cin.get();
    return 0;
}

这些行的输出是0(false,对于int矢量)和1(true,对于A矢量)。