说我必须以某种方式处理ushort
,uint
但string
不同。所以猜想我需要一个专门的模板和string
另一个。是吗?ushort
uint
// for most
void func(T)(T var) { ... }
// for uint and ushort
void func(T: uint, ushort)(T var) { ... }
这就是想法,尽管代码无法编译。它是有效的还是非常糟糕的?
说我必须以某种方式处理ushort
,uint
但string
不同。所以猜想我需要一个专门的模板和string
另一个。是吗?ushort
uint
// for most
void func(T)(T var) { ... }
// for uint and ushort
void func(T: uint, ushort)(T var) { ... }
这就是想法,尽管代码无法编译。它是有效的还是非常糟糕的?
尝试这个:
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
}
}
如果您只需要特定类型,请按照彼得的回答。
如果您想涵盖所有整数/数字数据和所有字符串(包括 wstring 和 dstring)数据类型,那么您可以使用std.traits
模块中的帮助程序:
import std.traits;
void func(T)(T var)
{
static if (isNumeric!T) { // or isIntegral!T
//...
} else if (isSomeString!T) {
//...
}
else {
//...
}
}
你不准确理解他的意思混合多模板参数应该这样做
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");
}
}