C++ 模板参数包指针的大小

C++ 模板参数包指针的大小,c++,c++17,C++,C++17,我有点卡住了 如何在参数包循环中获取结构的大小 如果我只传递结构,我会得到正确的大小,但是如果我通过指针或引用传递它,大小总是8 struct foo_s { int i1; int i2; int i3; }; template<typename ...Args> void Call(Args&& ...args) { std::size_t index = 0; auto process = [&] <typ

我有点卡住了

如何在参数包循环中获取结构的大小

如果我只传递结构,我会得到正确的大小,但是如果我通过指针或引用传递它,大小总是8

struct foo_s {
    int i1;
    int i2;
    int i3;
};

template<typename ...Args>
void Call(Args&& ...args)
{
    std::size_t index = 0;
    auto process = [&] <typename Arg> (Arg && arg, std::size_t index) {
        std::size_t size = sizeof(Arg); // always 8
    };
    (process(std::forward<Args>(args), index++), ...);
}


int main() {

    foo_s foo = { 1, 2, 3 };
    foo_s* pFoo = &foo;

    Call(pFoo);
}
struct foo\s{
int i1;
int i2;
int i3;
};
模板
无效调用(Args&&…Args)
{
标准:尺寸指数=0;
自动处理=[&](参数和参数,标准::大小索引){
std::size\u t size=sizeof(Arg);//始终为8
};
(进程(std::forward(args)、index++、…);
}
int main(){
foo_s foo={1,2,3};
foo_s*pFoo=&foo;
呼叫(pFoo);
}

您可以使用的组合来获取基础类型。如果您也关心指针类型,请添加一层
std::remove_pointer

auto process = [&] <typename Arg> (Arg && arg, std::size_t index) {
    using UnderlyingType = typename std::remove_cvref<Arg>::type;         
    std::size_t size = sizeof(UnderlyingType); 
};
auto process=[&](Arg&&Arg,std::size\u t index){
使用underlyngType=typename std::remove_cvref::type;
std::size\u t size=sizeof(底层类型);
};

我首先写道,
std::decay
也是一种可能性。虽然它对引用的行为正确,但在数组和指针类型上没有重新请求的行为。

您可以使用的组合来获取基础类型。如果您也关心指针类型,请添加一层
std::remove_pointer

auto process = [&] <typename Arg> (Arg && arg, std::size_t index) {
    using UnderlyingType = typename std::remove_cvref<Arg>::type;         
    std::size_t size = sizeof(UnderlyingType); 
};
auto process=[&](Arg&&Arg,std::size\u t index){
使用underlyngType=typename std::remove_cvref::type;
std::size\u t size=sizeof(底层类型);
};

我首先写道,
std::decay
也是一种可能性。虽然它对引用的行为正确,但在数组和指针类型上没有重新请求的行为。

我们可以删除引用,然后删除指针(如果是指针类型),并获取其大小:

std::size_t size = sizeof(std::remove_pointer_t<std::remove_reference_t<Arg>>);

我们可以删除引用,然后删除指针(如果它是指针类型),并获取其大小:

std::size_t size = sizeof(std::remove_pointer_t<std::remove_reference_t<Arg>>);

但这是正确的。如果您想让它剥离指针,请使用
std::remove\u pointer\t
,但要做好意外准备。但是,引用应始终具有其目标的大小。它在概念上并不存在。只有将实现定义的大小放在结构中并取其大小时,该大小才可用。@dfri和remove\u指针当然是因为op所追求的。但这是正确的。如果您想让它剥离指针,请使用
std::remove\u pointer\t
,但要做好意外准备。但是,引用应始终具有其目标的大小。它在概念上并不存在。只有将实现定义的大小放在结构中并取其大小时,该大小才可用。@dfri和remove\u指针当然是因为op所追求的。由于此问题已标记为C++17,您可能需要使用特性的别名模板(根据C++14添加)而不是显式地键入详细的
typename…::键入
。由于此问题已标记为C++17,您可能希望使用特性的\u t别名模板(根据C++14添加),而不必显式键入详细的
类型名…::键入
。如果需要,您可以继续添加我的解决方案。我会删除我的答案,没有交叉引用的意义:)如果你愿意,你可以继续添加我的解决方案。我将删除我的答案,没有交叉参考答案的意义:)