我有几个object
,例如object Buffer
,提供确定的功能,我想致电
binding(bufferName[Buffer.VERTEX] to GL_ARRAY_BUFFER) {
... // calling Buffer functions
}
由于object Buffer
GL_ARRAY_BUFFER
的功能
binding
目前是如此定义的
inline fun <T, R> binding(pair: Pair<Int, Int>, block: T.() -> R)
所以我的问题是,是否可以根据pair.second将T“转换”为特定对象,以便我可以调用该对象提供的那些函数?
答案 0 :(得分:1)
据我所知,根据Int值pair.second
选择T不是可能的。但是,密封类是实现这种“每种值的不同方法的枚举”的一种好方法:
sealed class BufferType(val type: Int) {
class ArrayBuffer() : BufferType(GL_ARRAY_BUFFER)
class AtomicCounterBuffer() : BufferType(GL_ATOMIC_COUNTER_BUFFER)
/* other buffer types... */
}
inline fun <Buffer: BufferType, R> binding(pair: Pair<Int,Buffer>, block : (Buffer) -> R) {
glBindBuffer(pair.second.type, pair.first)
block()
/* ... */
}
然后,您可以在顶级BufferType
类(对于全局可用方法)或每个单独的缓冲区类型上公开所有可用的缓冲区方法。