如何获取继承Struct(ffi)的泛型参数的大小?
解决Dart泛型中
sizeOf<T>()无法使用类型参数的问题 问题本质
你碰到的核心矛盾是:sizeOf<T>()是编译期常量函数,必须在编译阶段就明确传入的具体类型;但Dart的泛型采用类型擦除机制,泛型参数T只有在运行时才会绑定具体类型,编译期编译器无法确定T的实际类型,因此报错。
可行解决方案
方案1:实例化时传入预计算的size值
把sizeOf<具体Struct>的计算提前到创建Test实例的环节——此时你必须指定具体的Struct类型,编译期能正常计算出size:
import 'dart:ffi'; class Test<T extends Struct> { final int _structSize; // 构造时传入提前计算好的size Test(this._structSize); int sizeOfT() { return _structSize; } } // 自定义Struct示例 class MyStruct extends Struct { @Int32() external int value; } // 使用方式 void main() { final test = Test<MyStruct>(sizeOf<MyStruct>()); print(test.sizeOfT()); // 输出4(Int32的大小) }
方案2:为每个具体Struct创建Test子类
如果不想每次实例化都手动传size,可以给每个Struct写对应的Test子类,在子类里直接硬编码sizeOf<具体Struct>:
import 'dart:ffi'; abstract class Test<T extends Struct> { int sizeOfT(); } class MyStruct extends Struct { @Int32() external int value; } class MyStructTest extends Test<MyStruct> { @override int sizeOfT() { return sizeOf<MyStruct>(); } } // 使用方式 void main() { final test = MyStructTest(); print(test.sizeOfT()); // 输出4 }
方案3:给Struct子类添加静态size常量
在自定义的Struct子类里定义静态size常量,后续通过传入获取常量的函数来拿到size:
import 'dart:ffi'; class MyStruct extends Struct { @Int32() external int value; // 提前定义静态size常量 static const int size = sizeOf<MyStruct>(); } class Test<T extends Struct> { final int Function() _sizeGetter; // 构造时传入获取size的函数 Test(this._sizeGetter); int sizeOfT() { return _sizeGetter(); } } // 使用方式 void main() { final test = Test<MyStruct>(() => MyStruct.size); print(test.sizeOfT()); // 输出4 }
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

