采用用template， 方便外部扩展