能否在D语言中实现此类模板?类内模板构造器问题求解
D语言类中模板构造函数的修复方案
你的代码无法运行主要有两个原因:
- 存在语法错误:
static if (is(U:V[],V))语句缺少闭合的右括号); - 类中模板构造函数的写法不符合D语言规范,不能直接用
template this(T : U[], U)这种形式定义。
修正后的实现方案
在D语言的类中,构造函数可以直接声明为模板函数,编译器会自动推导模板参数类型,以下是修复后的代码:
class MyClass { // 模板化构造函数,自动推导数组元素类型U this(U)(U[] array) { static if (is(U : V[], V)) // 判断U是否为数组类型(即输入是二维数组) { // 这里添加二维数组的处理逻辑 import std.stdio; writeln("正在处理二维数组"); } else static if (is(U : V[string], V)) // 判断U是否为关联数组(哈希表)类型 { // 这里添加元素为关联数组的处理逻辑 import std.stdio; writeln("正在处理元素为哈希表的数组"); } else { // 处理普通元素类型的一维数组 import std.stdio; writeln("正在处理普通一维数组"); } } } // 测试代码 void main() { auto obj1 = new MyClass([1, 2, 3]); // 普通一维数组 auto obj2 = new MyClass([[1, 2], [3, 4]]); // 二维数组 auto obj3 = new MyClass([["key1": 1], ["key2":2]]);// 元素为哈希表的数组 }
关键说明
- 直接在构造函数
this后添加模板参数列表(U),即可实现模板化构造函数,无需额外定义template this; - 修复了原代码中
static if语句的语法错误,补充了缺失的右括号; - 通过
static if的编译期分支判断,可以针对不同的元素类型编写对应的处理逻辑。
内容的提问来源于stack exchange,提问作者Aftershock
相关产品推荐
相关产品推荐

