d版本块作为表达式

原文

version(Windows)
    alias socket_t = size_t;
else
    alias socket_t = int;

目前这样,太麻烦了.希望能够:

alias socket_t = version(Windows) size_t else int;
//或类似
alias socket_t = switch (builtin.target.os) {
    .windows => size_t,
    else     => int
};

我这样:

enum BUGFIX_MAX_LIVES = Version.SM64_US || Version.SM64_EU || Version.SM64_SH;
enum BUGFIX_KING_BOB_OMB_FADE_MUSIC = Version.SM64_US || Version.SM64_EU;

如果只关心"全局"标识符,这样:

module mver;

struct ver {
  template opDispatch(string M) {
     mixin(`
        version(`~M~`) enum opDispatch = true;
        else           enum opDispatch = false;
     `);
  }
}
//
import mver;

static if (ver.linux && !ver.D_LP64) {
  /* ... */
}

技巧:

template isVersion(string ver) {
    mixin(format(q{
        version(%s) {
            enum isVersion = true;
        }
        else {
            enum isVersion = false;
        }
    }, ver));
}

pragma(msg, isVersion!"foo");     // false
pragma(msg, isVersion!"assert");  // true

这样:

import std.meta : anySatisfy;
static if (anySatisfy!(isVersion, "assert", "unittest")) ...

版本不合适时,使用枚举.

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