d初化模板构造器

原文

struct TestArray(ulong element_n) {
  int[element_n] elements;

  this(string type)(ulong number) {
    pragma(msg, "类型为: " ~ typeof(type).stringof);
  }
}
//我想创建它并能够成功地初始化,构造函数的模板参数
void main() {
  // 不行
  auto val = TestArray!(10, "int")(60);
  // 不行
  auto val = TestArray!(10).TestArray!("int")(60);
  // 不行.
  auto val = TestArray!(10).this!("int")(60);
}

//

struct TestArray(ulong element_n, string type) {
  int[element_n] elements;
  this(ulong number) {
    pragma(msg, "类型为: " ~ typeof(type).stringof);//Qth
  }
}

struct TestArray(ulong element_n, string type) {
  int[element_n] elements;

  this(ulong number) {
    mixin("alias T = " ~ type ~ ";");
    pragma(msg, "类型为: " ~ T.stringof);
  }
}
//用T类型
struct TestArray(ulong element_n, T) {
  int[element_n] elements;

  this(ulong number) {
    pragma(msg, "类型为: " ~ T.stringof);
  }
}

TestArray!(10, "int") val = TestArray!(10, "int")(100);
//或
TestArray!(10, int) val = TestArray!(10, int)(100);
//我将推荐一个别名以使其更容易:
alias IntTestArray = TestArray!(10, int);
...
IntTestArray val = IntTestArray(100);

struct TestArray(ulong element_n) {
  int[element_n] elements;

  this(type)(type number)
  {
    pragma(msg, "类型为: " ~ type.stringof);
  }
}
auto val = TestArray!10(ubyte(60));

工厂函数:

TestArray!T testarray(string s, T)(T val) {
   ... // 依赖
   return TestArray!T(...) // 构造器.
}
//或这样:
struct StringAnnotated(string s, T)
{
   T val;
}

StringAnnotated!(s, T) annotate(string s, T)(T val)
{
   return StringAnnotated!(s, T)(val);
}

struct TestArray(ulong element_n)
{
   ...
   this(T)(T val) if (isInstanceOf!(StringAnnotated, T))
   {
      ...
   }
}

// use like
TestArray!10(60.annotate!"int");

用辅助函数:

import std.stdio;

struct TestArray(ulong element_n, string type) {
  int[element_n] elements;
  mixin(type) member;
  pragma(msg, "类型为: ", typeof(member));

  this(ulong number) {
    writeln("用", number,"构建");
  }
}

auto makeTestArray(ulong element_n, string type)(ulong number) {
  return TestArray!(element_n, type)(number);
}

void main() {
  auto ta = makeTestArray!(10, "int")(60);
}
//用嵌套模板
import std.stdio;

template TestArray(ulong element_n) {
  struct TestArrayImpl(Type) {
    int[element_n] elements;

    this(ulong number) {
      pragma(msg, "类型为: ", Type);
      writeln("用", number,"构建");
    }
  }

  auto makeFor(string s)(ulong number) {
    return TestArrayImpl!(mixin(s))(number);
  }
}

void main() {
  auto ta = TestArray!10.makeFor!"int"(60);
}
posted @   zjh6  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示