0

以下のコードの場合:

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 がクラス/構造体または double などのポッドを指しているインターレーターであるかどうかを確認するにはどうすればよいですか?

double を指している場合は *_First を使用してデータを取得し、クラスを指している場合は (*_First)() を使用して実際のデータを取得します (クラスにオーバーロードされた演算子があると仮定して) ().

上記のようなことを試しましたが、「_Val=_Func(_Val, *_First);」という行でコンパイルに失敗し、MyObj を double に変換できないとのことでした。

4

1 に答える 1

1
#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 (int ベクトルの場合は false) と 1 (A ベクトルの場合は true) です。

于 2013-07-06T03:10:22.773 に答える