6

ベクトルの合計サイズを再生して計算しようとしているときに、次のようなことを試しました

vector<double> vd;
auto area = vd.size()* sizeof (vd::value_type); 
//Ive seen Stepanov use area as name for this kind of size, idk if he adds the sizeof vd also to area :)

残念ながら、これは機能しません...使用する必要がありますvector<double>::value_typeが、コードが読みにくくなります。動作させることはできますか?sizeof vd.front()このために書くのは見苦しく見えるので、私は好きではありませんfront()
編集: decltype バリアントは、私が醜いカテゴリと呼ぶものにも当てはまります...

4

3 に答える 3

9

私は使用できると思います: decltype

auto area = vd.size() * sizeof(decltype(vd)::value_type);

あなたが使用しているautoように、C++ 11が許可されていると思います。

g++ v4.7.2 および clang v3.3 で確認済み。

于 2012-12-18T15:52:03.380 に答える
4

簡単なヘルパー関数はどうですか?

template <typename Container>
size_t value_size(const Container &)
{
    return sizeof(typename Container::value_type);
}

[...]

vector<double> vd;
auto area = vd.size() * value_size(vd);

関数をオーバーロードして、配列などの他のコンテナーで動作するようにすることもできます (もちろん、ラップも必要ですsize)。

理想的には、計算全体を汎用関数にラップできます。

template <typename Container>
size_t area(const Container &c)
{
    return c.size() * sizeof(typename Container::value_type);
}

//possible overload for arrays (not sure it's the best implementation)
template <typename T, size_t N>
size_t area(const T (&arr)[N])
{
    return sizeof(arr);
}

[...]

std::vector<double> vd;
auto vd_area = area(vd);
double arr[] = { 1., 2. };
auto arr_area = area(arr);
于 2012-12-18T15:58:53.657 に答える
1

C++11 では、以下を使用できますdecltype(vd[0])

auto area = vd.size()* sizeof (decltype(vd[0])); 

しかし、特定のシナリオでは、次のように書くことができます:

auto area = vd.size()* sizeof (vd[0]); 

sizeof(and too)内の式は評価されないため、が空decltypeであっても両方が機能します。vd

于 2012-12-18T15:52:47.233 に答える