【问题标题】:c++ get number of bytes of the function arguments [duplicate]c ++获取函数参数的字节数[重复]
【发布时间】:2020-11-03 05:39:03
【问题描述】:

如何获取函数参数的字节大小? 例子: void DummyFun(int64_t a, int32_t b, char c); 字节大小将是 13。

我正在尝试通过使用模板来解决这个问题,但我不太擅长。

这是上下文化的代码以及我目前尝试过的代码:

template<typename T>
constexpr size_t getSize()
{
    return sizeof(T);
}

template<typename First, typename ... Others>
constexpr size_t getSize()
{
    return getSize<Others...>() + sizeof(First);
}

class NamelessClass
{
private:
    typedef void (*DefaultCtor)(void*);
    
    void HookClassCtor(DefaultCtor pCtorFun, size_t szParamSize);

public:
    template<typename T, typename ... Types>
    inline void HookClassCtor(T(*pCtorFun)(Types ...))
    {
        // I need the size in bytes not the count
        // HookClassCtor(reinterpret_cast<DefaultCtor>(pCtorFun), sizeof...(Types));
        
        size_t n = getSize<Types ...>();
        HookClassCtor(reinterpret_cast<DefaultCtor>(pCtorFun), n);  
    }
};

【问题讨论】:

    标签: c++ templates variadic-templates


    【解决方案1】:

    在 C++17 中,您可以使用 fold expression:

    template<typename... Others>
    constexpr size_t getSize() {
        return (sizeof(Others) + ...);
    }
    

    Demo

    【讨论】:

    • 完美!非常感谢。
    • @guila 不客气!
    • @guila 请注意:sizeof 总数很可能将等于参数将在堆栈上占用的字节数。我不知道有一种可移植的方法来计算。
    • 是的,大小取决于编译函数的调用约定。在某些调用约定中,值在寄存器、堆栈或两者中传递。所以,只要我跟踪使用的调用约定,如果我没有遗漏任何东西,我就不应该遇到问题。不过谢谢你指点我。
    • @guila 太棒了!这听起来像你在上面。我只是在确定! :)
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2012-11-19
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多