You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Lambda传递数组以正确使用sizeof()?

Lambda替换#define时数组sizeof失效的解决方案

问题背景

现有编译生成的着色器字节数组:

const BYTE ShaderByteCode[] = 
{
     68,  88,  66,  67, 233, 176, 
     42,  49,  64,  77, 131, 190, 
     75,  97, 214,  59, 236, 203, 
    188, 191,   1,   0,   0,   0, 
    // ... 其余字节
};

原用宏定义调用SetPixelShader,能正确通过sizeof(ShaderByteCode)获取数组实际大小:

#define doThing(Thing, ShaderByteCode) \
Thing.SetPixelShader(ShaderByteCode, sizeof(ShaderByteCode) ); \

但替换为Lambda后,数组参数退化为指针,sizeof()返回指针大小而非数组实际长度:

auto doThing = [](Thing& thing, const BYTE ShaderByteCode[]) {
        thing.SetPixelShader(ShaderByteCode, sizeof(ShaderByteCode));
    };

疑问:能否仅向Lambda传递单个数组参数,还是必须单独传入数组大小?

解决方案

不需要单独传入数组大小,通过模板化Lambda(C++14+) 或模板函数就能让编译器自动推导数组长度,实现和原宏定义相同的效果:

1. C++14及以上:模板化Lambda

把数组参数声明为数组引用,配合模板参数推导数组长度:

#include <cstddef> // 引入std::size_t

template<std::size_t N>
auto doThing = [](Thing& thing, const BYTE (&ShaderByteCode)[N]) {
    thing.SetPixelShader(ShaderByteCode, N);
};

调用时直接传入Thing对象和ShaderByteCode数组,编译器会自动推导N为数组的实际大小。

2. C++11:模板函数替代Lambda

C++11不支持模板化Lambda,可改用普通模板函数:

#include <cstddef> // 引入std::size_t

template<std::size_t N>
void doThing(Thing& thing, const BYTE (&ShaderByteCode)[N]) {
    thing.SetPixelShader(ShaderByteCode, N);
}

调用方式和Lambda一致,同样无需手动传入数组大小。

原理说明

当参数声明为const BYTE (&ShaderByteCode)[N]时,数组不会退化为指针,编译器会保留数组的类型信息(包含长度N),通过模板参数推导就能直接获取数组的实际大小,既避免了宏定义无类型检查的弊端,又保留了原有的便捷性。

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:55:26