一个专用 D 模板中有多种类型

发布于 2024-09-26 14:17:55 字数 348 浏览 8 评论 0原文

假设我必须以某种方式处理 ushortuint,但 string 有所不同。所以我想我需要一个专门用于 string 的模板,以及用于 ushortuint 的其他模板。是吗?


// for most
void func(T)(T var) { ... }

// for uint and ushort
void func(T: uint, ushort)(T var) { ... }

这就是想法,尽管代码无法编译。这是有效还是非常糟糕?

Say I have to deal ushort and uint some way, but string differently. So guess I need one specialized template for string and other to both ushort and uint. Is it?


// for most
void func(T)(T var) { ... }

// for uint and ushort
void func(T: uint, ushort)(T var) { ... }

That is the idea, although the code can't compile. It's valid or very bad?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

遗弃M 2024-10-03 14:17:55

试试这个:

void func(T)(T var) if ( is(T : uint) || is(T : ushort) )
{
   ...
}

void func(T : string)(T var)
{
   ...
}

您也可以在一个函数中完成它:

void func(T)(T var)
{
    static if ( is(T : uint) || is(T : ushort) )
    {
        ...
    }
    else if ( is(T : string) )
    {
        ...
    }
    else
    {
        // handle anything else
    }
}

Try this:

void func(T)(T var) if ( is(T : uint) || is(T : ushort) )
{
   ...
}

void func(T : string)(T var)
{
   ...
}

You could also do it in one function:

void func(T)(T var)
{
    static if ( is(T : uint) || is(T : ushort) )
    {
        ...
    }
    else if ( is(T : string) )
    {
        ...
    }
    else
    {
        // handle anything else
    }
}
清风夜微凉 2024-10-03 14:17:55

如果您只需要特定类型,请按照 Peter 的回答。
如果您想涵盖所有整数/数字数据和所有字符串(包括 wstring 和 dstring)数据类型,那么您可以使用 std.traits 模块:

import std.traits;

void func(T)(T var)
{
    static if (isNumeric!T) { //  or isIntegral!T
        //...
    } else if (isSomeString!T) {
        //...
    }
    else {
        //...
    }
}

If you need only specific types, follow Peter's answer.
If you would like to cover all integral/numeric data and all string (including wstring and dstring) data types, then you could use helpers from std.traits module:

import std.traits;

void func(T)(T var)
{
    static if (isNumeric!T) { //  or isIntegral!T
        //...
    } else if (isSomeString!T) {
        //...
    }
    else {
        //...
    }
}
猫九 2024-10-03 14:17:55

你没有准确理解他的意思
混合多模板参数应该这样做

void func(T...)(T args)
{
    static if(T.length==2&&is(T[0]:int)&&is(T[1]:short))
    {
       //do some thing func(int,short)
    }else static if(T.length==1&&is(isSomeString!T[0])
    {
    }otherwise
    {
       static assert("unsupport function");
    }

}

You are not precise understand his meaning
mix multi template parameters should do like this

void func(T...)(T args)
{
    static if(T.length==2&&is(T[0]:int)&&is(T[1]:short))
    {
       //do some thing func(int,short)
    }else static if(T.length==1&&is(isSomeString!T[0])
    {
    }otherwise
    {
       static assert("unsupport function");
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文