测试别名是否是 D 2.0 中的模板
如何测试别名是否是 D 2.0 中的模板?
template isTemplate(alias T)
{
enum bool isTemplate = ???;
}
更新:
它应该像这样工作:
struct S(T)
{
int opCall() { return 0; }
int opUnary(string s)() if (s == "-") { return 0; }
}
pragma(msg, isTemplate!(S)); //Should print true
pragma(msg, isTemplate!(S!(int))); //Should print false
pragma(msg, isTemplate!((S!(int)).opCall)); //Should print false
pragma(msg, isTemplate!((S!(int)).opUnary)); //Should print true
作为参考,不起作用的事情:
你不能使用任何像
T!(.. .)
因为你不知道用什么来代替省略号。你不能说
&T
,因为如果你只给出一个普通的旧类型名称,这也不起作用。
How do I test if an alias is a template in D 2.0?
template isTemplate(alias T)
{
enum bool isTemplate = ???;
}
Update:
It should work like:
struct S(T)
{
int opCall() { return 0; }
int opUnary(string s)() if (s == "-") { return 0; }
}
pragma(msg, isTemplate!(S)); //Should print true
pragma(msg, isTemplate!(S!(int))); //Should print false
pragma(msg, isTemplate!((S!(int)).opCall)); //Should print false
pragma(msg, isTemplate!((S!(int)).opUnary)); //Should print true
For reference, things that don't work:
You can't use any expression like
T!(...)
because you don't know what to put in place of the ellipses.You can't say
&T
because that also doesn't work if you're just given a plain old type name.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这通过了除我在 另一个答案
失败的 2 个测试如下:
如果您确定模板不会有包含
"...!(..."
的默认参数我认为使用是安全的。This passes all except 2 tests I have listed in the other answer
The 2 tests that have failed like:
If you are sure the template won't have a default argument containing
"...!(..."
I think it is safe to use.这也带来了额外的限制 - 它必须是可以使用给定参数实例化的模板。
this also puts additional constraint - it must be template which can be instantiated with given arguments.
此代码正在应用运算符地址“&”不适用于模板,用于识别模板标识符。
输出是:
This code is applying operator address-of '&' which is not applicable to templates, to identify template identifier.
output is:
模板别名参数可以接受很多东西:变量、自定义类型、模块、模板和文字。
因此
isTemplate
应该通过以下测试用例:A template alias parameter can accept many things: variables, custom types, modules, templates and literals.
So that
isTemplate
should pass the following test cases: