C++ 我可以在向量的实例上使用value_type,而不是在它的类型上吗

C++ 我可以在向量的实例上使用value_type,而不是在它的类型上吗,c++,sizeof,C++,Sizeof,在玩游戏并试图计算向量的总大小时,我尝试了如下方法 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 :) vectorvd; 自动区域=vd.size()*sizeof(vd::value\u类

在玩游戏并试图计算向量的总大小时,我尝试了如下方法

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 :)
vectorvd;
自动区域=vd.size()*sizeof(vd::value\u类型);
//我见过斯捷潘诺夫用面积作为这种尺寸的名称,idk如果他把vd的尺寸也加在面积上:)
不幸的是,这不起作用。。。 我需要使用
vector::value\u type
,但这会降低代码的可读性。 它能起作用吗?我不喜欢vd.front()的大小,因为为它写
front()
看起来很难看。
编辑:decltype变体也适用于我所谓的丑陋类别…

我认为可以使用:

auto area = vd.size() * sizeof(decltype(vd)::value_type);
当您使用
auto
时,我假定允许使用C++11


用g++v4.7.2和clang v3.3确认。

在C++11中,可以使用
decltype(vd[0])

但在特定场景中,您可以这样写:

auto area = vd.size()* sizeof (vd[0]); 
由于不会计算
sizeof
(和
decltype
中的表达式),因此即使
vd

空。

一个简单的助手函数怎么样

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);

sizeof的参数没有按照您建议的方式计算-请这样想:编译器查看
vd。front
返回并应用该类型的sizeof,这里没有函数调用。请阅读我所说的。。。我知道的大小是编译时间。。。just.front()很难看,因为它不表示意图。。。它可能是.back()[.size()-1]…我为糟糕的措辞道歉。。。用“写”代替“打电话”写一件事很容易,同时思考另一件事/@菲克提克:我也在写。这和问题中提到的vd.front()的大小差不多。@interjay:我想OP想要的是语法上不同的东西。我认为
sizeof(vd[0])
在语法上不同于
sizeof(vd.front())
,尽管我不知道为什么他会觉得这两个词中的任何一个都很难看。@interjay阅读了我对原始问题的评论,得出了难看的理由:)+1非常确定它需要是
sizeof(typename Container::value\u type)工作正常。EclipseCDT用户注意:代码带下划线(警告)。这是报告的假阳性。(尽管可以编译)
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);
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);